Java Calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY),它会向后,向前还是未知?

2022-09-01 15:58:06

假设以下代码在 2009 年 8 月 22 日(星期六)执行

   Calendar c = Calendar.getInstance();
   c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);

c.get(Calendar.DAY_OF_MONTH)将返回23。我对条件感兴趣,会返回14(上周日,而不是下一个周日)。

是否有任何与日历将滚动时间设置的方向相关联的规则?如果是这样,它们是什么?DAY_OF_MONTH/YEARDAY_OF_WEEK


答案 1

它应该始终保持不变(http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#WEEK_OF_MONTH)。从文档中:WEEK_OF_MONTH

设置或获取WEEK_OF_MONTH或WEEK_OF_YEAR字段时,日历必须确定月份或年份的第一周作为参考点。一个月或一年的第一周被定义为最早的七天周期,从 getFirstDayOfWeek() 开始,并且至少包含该月或一年的 getMinimalDaysInFirstWeek() 天数。周数..., -1, 0 在第一周之前;周数为 2、3,...跟着它。请注意,get() 返回的规范化编号可能不同。例如,特定的日历子类可以将一年的第 1 周之前的一周指定为前一年的 n 周。


答案 2

以下公式返回一周内[0;6]范围内的“当前”日

(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek

或者如果需要范围 [1;7] ,请添加 1

(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek + 1

d是回报Calendar.get(Calendar.DAY_OF_WEEK)

若要获取一周的第一天,请从当前日期减去公式的结果。下面的代码可以做到这一点:

final int currentDayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) + 7 - cal.getFirstDayOfWeek()) % 7;
cal.add(Calendar.DAY_OF_YEAR, -currentDayOfWeek);

推荐