Java日历-设置day_of_week后日期不可预测

我在JUnit测试中有以下代码,该代码上周似乎正常工作,但本周失败了:

Calendar cal = Calendar.getInstance();

cal.set(2011, Calendar.JULY, 12);

cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); // push the date to 15

System.out.println(cal.get(Calendar.DATE));

您可能会从我的评论中推断出,由于12日是星期二,因此我希望将DAY_OF_WEEK设置为星期五后,日期将为15。但是,打印的值为22,并导致测试失败。

但是,如果我将代码更改如下,并添加另一个调用以获取:

Calendar cal = Calendar.getInstance();

cal.set(2011, Calendar.JULY, 12);

System.out.println(cal.get(Calendar.DATE));

cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); // push the date to 15

System.out.println(cal.get(Calendar.DATE));

我得到预期的输出12和15。

有人可以解释发生了什么,为什么上周该测试仍然有效?

回答:

首先要了解的是,Month + Day + DayOfWeek对日历没有任何意义。日历将根据以下信息计算日期的真实值

年+月+日期

要么

YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK

(或其他一些组合,例如年+年的某日等)。因此,日期+ DayOfWeek在本质上并没有太大的意义。

要理解的第二件事是,在Java日历上进行设置时,它实际上不会重新计算绝对时间或更新相关字段,直到发生强制计算的操作为止。

第一次设置后,日历处于冲突状态。月和日表示今天是7月12日,但“星期几”和“星期几”仍然说今天是今天,无论今天是什么。然后,您将星期几设置为星期五。因此,现在每年的月份和日期都说是7月12日,但是“月份的周”和“星期几”字段表示是“本周”的星期五。

日历规则规定,发生冲突时,最近设置的字段将“获胜”,因此用于计算其他字段的是星期几和星期几再加上本周的星期五。

在中间插入一个get会“修复”它,因为它会强制将日历的整个内部状态重新计算到7月12日(星期二),然后再设置为星期五,因此不会发生内部冲突。在将星期几设置为星期五之前,通过重新计算,“月份的星期”设置为包含7月12日的星期。

编辑:很抱歉两天后做出更改,注意到此文件已在旧的浏览器选项卡中打开,并认为我会为将来的Google员工提供希望的帮助而扩展:

它在评论中为乔恩工作的原因是他住在伦敦。他的计算机认为星期几从星期一开始。因此,当被问及“本周”的星期五时,当在7月17日(星期日)被询问时,它仍然会在7月15日做出回应。之所以提出这一点,是因为在不同的语言环境中一周中不同的第一天只是尝试在日历中使用WEEK_OF字段的另一种方式。

以上是 Java日历-设置day_of_week后日期不可预测 的全部内容, 来源链接: utcz.com/qa/421904.html

回到顶部