2015第8周五

大年初二,今天杭州天气晴转阴小雨,个人心情阴转晴,感觉还不错。

一天没怎么出去,晚上和朋友一起唱歌,看了点html5话题的精华文章。

明天要准备去学车了。

<think>我们使用Calendar类来获取本周五和下周五的日期。 思路: 1. 获取当前日期对应的Calendar实例。 2. 获取当前是星期几(注意:Calendar中星期日是1,星期一是2,...,星期六是7)。 3. 计算到本周五还需要多少天(假设今天是星期三,那么到周五需要2天;如果今天是星期六,那么本周五已经过去,我们需要计算下周五)。 4. 但是根据需求,我们可能需要的是本周五(如果本周五还没过)或者下周五(如果本周五已经过了)。另一种常见需求是:无论本周五是否过去,本周五指的是当前周的周五,下周五指的是下一周的周五。 这里我们按照两种理解分别给出方法: 理解1:如果今天是周一至周四,则本周五就是当前周的周五;如果今天是周五,则本周五就是今天;如果今天是周六或周日,则本周五已经过去,那么本周五指的是当前周的周五(即已经过去的那天),但通常我们可能需要的是未来的周五,所以此时我们可能想要的是下一周的周五(即下周五)。 理解2:我们只根据周来计算,不判断是否过去。即本周五就是当前周的周五(可能是未来也可能是过去),下周五就是下一周的周五。 根据问题,用户可能想要的是未来的周五(即如果本周五还没到就取本周五,如果已经过了就取下周五),或者严格按周来取(即本周五就是当前周的周五,下周五就是下一周的周五)。 我们分别实现: 方法A:获取下一个周五(如果今天是周五,则返回今天;如果今天在周五之前,则返回本周五;如果今天在周五之后,则返回下周五) 方法B:获取本周五(当前周的周五,不考虑是否过去) 方法C:获取下周五(下一周的周五) 根据问题,用户可能想要的是方法A(即下一个周五)或者方法C(下周五)。但问题中同时提到了“本周五或下周五”,所以我们需要明确。 我们假设用户需要的是: - 如果当前还没到本周五,则返回本周五 - 如果已经过了本周五,则返回下周五 这其实就是方法A(下一个周五)。 同时,用户也可能需要分别获取本周五(当前周的周五)和下周五(下一周的周五),所以我们也可以分别提供。 下面我们分别实现: 1. 获取下一个周五(即最近的一个未来的周五,如果今天是周五则返回今天) 2. 获取本周五(当前周的周五,可能是过去、今天或未来) 3. 获取下周五(下一周的周五) 步骤: 首先,我们需要知道周五在Calendar中对应的值。Calendar中,星期天是1,星期一是2,...,星期六是7,所以周五是6。 方法1:获取下一个周五(包括今天) - 获取当前星期几(currentDayOfWeek) - 计算与周五(6)的差值: 如果当前星期几小于等于6(周五),那么差值 = 6 - currentDayOfWeek 如果当前星期几大于6(即周六或周日,分别为7和1),那么差值 = 6 - currentDayOfWeek + 7 (因为要下周) - 但是注意:如果当前是周日(1),那么1>6是不成立的,所以实际上我们这样处理: 我们可以统一用公式: daysToAdd = (6 - currentDayOfWeek + 7) % 7; 但是这样如果当前是周五(6),则(6-6+7)%7=7%7=0,正确(不需要加,就是今天)。 如果当前是周六(7),则(6-7+7)%7=6%7=6,即6天后(下周五),正确。 如果当前是周日(1),则(6-1+7)%7=12%7=5,即5天后(下周五),正确。 如果当前是周一(2),则(6-2+7)%7=11%7=4,即4天后(本周五),正确。 但是注意:Calendar的星期天是1,周六是7,所以这个公式是通用的。 但是,我们还有一种情况:如果用户想要的是严格的本周五(即使已经过去)和下周五,那么就不需要判断是否过去,而是直接计算。 方法2:获取本周五(当前周的周五) - 先设置当前时间,然后找到当前周周一的日期,然后加4天(因为周一加4天就是周五)?或者用上面的方法,但是不考虑过去,直接计算当前周周五的日期。 - 另一种方法:先获取当前是星期几,然后计算与周五的差值(可能是负数,但我们可以调整到当前周) 我们可以这样:先获取当前日期,然后减去当前星期几(转换为以周一为第一天的话,需要调整),但这样复杂。 实际上,我们可以统一使用一个方法:先设置当前日期,然后设置到本周的周五(不管是否过去)。 步骤: - 获取当前Calendar实例 - 获取当前星期几(currentDayOfWeek) - 计算要添加的天数:daysToAdd = (Calendar.FRIDAY - currentDayOfWeek + 7) % 7; 但是注意:Calendar.FRIDAY的值是6。 如果当前是周五,那么daysToAdd=0,即本周五就是今天。 如果当前是周六,那么(6-7+7)%7=6%7=6,即下周五?不对,这里我们想要的是本周五(已经过去),但这样算出来的是6天后,是下周五。所以这个公式得到的是下一个周五(包括今天)。 所以,如果我们想要本周五(即使已经过去),那么应该这样: - 首先,我们要知道当前周的周五是哪一天。我们可以将当前日期调整到本周的周一,然后加4天(因为周一加4天就是周五)。但是注意,Calendar中设置一周的第一天为周一,那么当前周的周一就是这周的第一天。 根据引用[1]中的代码,我们可以设置一周的第一天为周一,然后获取当前周的周一,然后加4天得到周五。 因此,我们可以有两种方式: 方式一(获取本周五): 1. 设置一周的第一天为周一(calendar.setFirstDayOfWeek(Calendar.MONDAY);) 2. 获取当前日期是本周的第几天(相对于周一,周一是1,周二是2,...,周日是7) Calendar中,使用calendar.get(Calendar.DAY_OF_WEEK)得到的是星期几(1是周日,2是周一,...,7是周六) 但是当我们设置了一周的第一天为周一时,calendar.get(Calendar.DAY_OF_WEEK)返回的值并不会改变,它还是按照原来的(1是周日,2是周一...)。所以我们可以通过调整计算方式。 实际上,引用[1]中的方法可以获取当前周的所有日期,我们可以借鉴。 为了避免混淆,我们采用以下简单方法: 获取本周五(当前周的周五): - 先获取当前日期,然后减去当前星期几(以周一为基准)的偏移,再加4(因为周一加4天就是周五)?但是这样需要调整。 更简单的方法: - 获取当前日期,然后直接设置到周五,但是是当前周的周五。我们可以: Calendar cal = Calendar.getInstance(); cal.setFirstDayOfWeek(Calendar.MONDAY); cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); // 这样设置后,cal的日期就是当前周的周五(即使这个周五已经过去) 注意:set(DAY_OF_WEEK, FRIDAY) 会将日期调整到当前周的周五。因为设置了一周的第一天为周一,那么周五就是当前周的第五天。 测试:如果今天是周三(2019-10-09),那么设置后就是2019-10-11(周五)。 如果今天是周日(2019-10-13),那么设置后就是2019-10-11(本周五,已经过去)?不对,因为周日属于下一周吗?这取决于我们的定义。 但是,Calendar的set(DAY_OF_WEEK)方法会根据设置的一周的第一天(这里是周一)来调整到当前周的指定星期几。 根据Java文档:当设置了一周的第一天为周一时,那么调用set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY)会将日期设置为当前周的周五(从周一开始算起的第一周,包括上周的剩余天数吗?) 实际上,Calendar的周是从周日到周六的,但是当我们设置了一周的第一天为周一,那么当前周的范围就是周一到周日。所以,在周日调用set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY)会得到本周五(即已经过去的周五)?还是下周的周五? 我们测试一下:假设今天是2019年10月13日(周日),那么: 设置一周的第一天为周一:cal.setFirstDayOfWeek(Calendar.MONDAY); 然后设置:cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); // 6 这样设置后,cal的日期会变成2019年10月11日(本周五)还是2019年10月18日(下周五)? 根据Java文档:set(DAY_OF_WEEK, int) 方法将日期设置为当前周(从一周的第一天开始到最后一天)的指定星期几。注意,这个“当前周”是指日历实例所表示的周(即当前日期所在的周)。所以,在周日(2019-10-13)时,这个周是从2019-10-07(周一)到2019-10-13(周日),所以周五是2019-10-11。 因此,使用set(DAY_OF_WEEK, FRIDAY)会得到当前周的周五(即使已经过去)。 所以,我们可以这样: 获取本周五: Calendar cal = Calendar.getInstance(); cal.setFirstDayOfWeek(Calendar.MONDAY); // 设置一周的第一天为周一 cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); // 设置为当前周的周五 这样cal的日期就是本周五。 获取下周五: 在上面的基础上,加7天。 cal.add(Calendar.DATE, 7); 获取上一个周五: 减7天。 但是,注意:我们也可以不设置一周的第一天,因为无论一周的第一天设置为什么,当前周的概念是一样的。但是为了统一,我们设置一周的第一天为周一(符合中国习惯)。 但是,用户的需求可能是:获取下一个周五(即未来的第一个周五,包括今天)。我们可以这样: Calendar cal = Calendar.getInstance(); int currentDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); int daysToAdd = 0; if (currentDayOfWeek <= Calendar.FRIDAY) { daysToAdd = Calendar.FRIDAY - currentDayOfWeek; } else { daysToAdd = Calendar.FRIDAY - currentDayOfWeek + 7; } cal.add(Calendar.DATE, daysToAdd); 这样cal的日期就是下一个周五(包括今天)。 但是注意:Calendar.FRIDAY=6,而周日是1,所以如果今天是周日(1),那么1<=6成立,所以daysToAdd=6-1=5,即5天后(周五)正确(下周五)。如果今天是周六(7),7>6,所以daysToAdd=6-7+7=6,即6天后(下周五)。如果今天是周五(6),则daysToAdd=0。 所以,我们可以用这个方法来获取下一个周五(未来的第一个周五,包括今天)。 根据用户问题,我们提供两种方式: 1. 获取下一个周五(包括今天) 2. 获取本周五(当前周的周五,即使已经过去) 3. 获取下周五(下一周的周五) 代码实现: 方法1:获取下一个周五(包括今天) 方法2:获取本周五(当前周的周五) 方法3:获取下周五(下一周的周五) 注意:方法2和方法3可以通过设置DAY_OF_WEEK然后加减7天来实现,这样更简单。 下面我们写代码: 首先,我们写一个辅助方法来格式化日期,方便输出。 然后,我们分别实现三个方法。 注意:由于Calendar的月份从0开始,所以输出月份时要加1。 示例代码:</think>### 使用 Java Calendar 获取本周五和下周五日期 在 Java 中,使用 `Calendar` 类获取本周五或下周五的日期,关键在于计算当前日期到目标周五的天数差。以下是详细实现方法: #### 核心思路 1. **获取当前日期**:创建 `Calendar` 实例表示当前日期 2. **计算与周五的日期差**: - 周五在 `Calendar` 中对应值 `Calendar.FRIDAY = 6` - 计算当前日期到目标周五所需增减的天数 3. **调整日期**:通过 `add(Calendar.DATE, daysToAdd)` 调整日期 #### 完整代码实现 ```java import java.util.Calendar; import java.text.SimpleDateFormat; public class FridayDateCalculator { public static void main(String[] args) { // 获取本周五日期 Calendar thisFriday = getSpecificFriday(0); System.out.println("本周五: " + formatDate(thisFriday)); // 获取下周五日期 Calendar nextFriday = getSpecificFriday(1); System.out.println("下周五: " + formatDate(nextFriday)); } /** * 获取指定周数的周五日期 * @param weeksLater 0=本周, 1=下周, 2=下下周... */ public static Calendar getSpecificFriday(int weeksLater) { Calendar cal = Calendar.getInstance(); // 获取当前是星期几 (1=周日, 2=周一...7=周六) int currentDayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 计算到本周五还需多少天 int daysToFriday; if (currentDayOfWeek <= Calendar.FRIDAY) { daysToFriday = Calendar.FRIDAY - currentDayOfWeek; } else { daysToFriday = 7 - (currentDayOfWeek - Calendar.FRIDAY); } // 添加周数偏移 (每周7天) cal.add(Calendar.DATE, daysToFriday + (7 * weeksLater)); return cal; } /** 格式化日期输出 */ private static String formatDate(Calendar cal) { return new SimpleDateFormat("yyyy-MM-dd EEEE").format(cal.getTime()); } } ``` #### 关键逻辑说明 1. **日期差计算**: - 如果当前是 **周一至周四**(`currentDayOfWeek ≤ 6`),直接计算与周五的差值 - 如果当前是 **周六/周日**(`currentDayOfWeek > 6`),先跳到下周再计算 ```java if (currentDayOfWeek <= Calendar.FRIDAY) { daysToFriday = Calendar.FRIDAY - currentDayOfWeek; // 直接计算差值 } else { daysToFriday = 7 - (currentDayOfWeek - Calendar.FRIDAY); // 跳到下周 } ``` 2. **周数偏移处理**: ```java cal.add(Calendar.DATE, daysToFriday + (7 * weeksLater)); ``` - `weeksLater=0`:本周五 - `weeksLater=1`:下周五 - `weeksLater=2`:下下周周五 #### 示例输出 ``` 本周五: 2023-10-13 星期五 下周五: 2023-10-20 星期五 ``` #### 注意事项 1. **星期值映射**: - `Calendar.SUNDAY = 1`, `MONDAY = 2`, ..., `SATURDAY = 7` - 周五固定为 `Calendar.FRIDAY = 6` 2. **时区影响**: ```java // 如需指定时区 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")); ``` 3. **线程安全**: - `Calendar` 非线程安全,多线程环境需同步访问或使用 `ThreadLocal` 4. **替代方案**(Java 8+): ```java // 使用 Java 8 的 LocalDate LocalDate today = LocalDate.now(); LocalDate nextFriday = today.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); ``` 此实现精确处理了周边界情况(如周末获取本周五/下周五),并支持扩展获取任意周数的周五日期[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值