当前位置: 首页 > 面试题库 >

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

宗鸿博
2023-03-14
问题内容

我在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字段的另一种方式。



 类似资料:
  • 问题内容: 我有一个小时,分钟,日期和毫秒时间戳,并且正在尝试创建一个表示时间的Date对象。时间戳记是美国东部夏令时。 在剖析问题时,我创建了一些简单的测试代码以查看发生了什么,并观察到以下内容: 产生输出: 但是,如果我稍微更改代码: 我得到以下(不同)结果(!) 有人知道为什么会这样吗? 问题答案: 您需要先设置时区。请参阅下面的GregorianCalendar.setTimeZone的定

  • 当创建日历对象并使用SimpleDataFormat解析字符串来设置日期/时间时,是否可以在两行单独的代码中设置日期和时间?例如,在我的SQLite数据库中,日期(mm-dd-yyy)与时间(hh:mm)存储在一个单独的列中。做以下事情是否符合犹太教 第二个是卡尔。setTime line是否将日历对象的日期部分重置为现在,然后只更改时间?

  • 我正在寻找确切的开始和结束日期根据我们的桌面日历,如果我给周,年作为输入。但是上面的代码给出的输出是2009年1月27日星期日。我知道这是因为按照我们的说法,一周的第一天默认是星期天,但我需要按照桌面日历

  • 问题内容: 这似乎是一个典型的问题,但是我找不到这个问题的答案。 我有一个预订表: 您将看到我已经证明出发日期可以是到达日期,反之亦然 在添加日期之前,我检查日期范围是否与表格中的日期不冲突,重要的是允许将出发日期设为该人将要离开的到达日期,以便在我检查日期时允许这一点该表我使用以下SQL将日期添加到arrival_date,并从depart_date减去SUBTRACT: 当我添加第一个日期时,

  • 问题内容: 我有一个电影课,里面有开始日期,持续时间和结束日期。开始和停止日期是日期对象(私有日期startDate …)(这是一个分配,因此我无法更改),现在我想通过将持续时间(以分钟为单位)添加到startDate中来自动计算stopDate。 据我所知,不赞成使用Date的时间操作功能,因此是不好的做法,但另一方面,我看不到将Date对象转换为日历对象以操纵时间并将其重新转换为Date对象的

  • 因此,当我需要更新日历时,输入的日期结果会反映变化。