gpt4 book ai didi

Java 日历 : 1am switchover to standard time (from DST)

转载 作者:行者123 更新时间:2023-11-30 06:27:32 25 4
gpt4 key购买 nike

我有一些代码使用 Calendar.set() 返回给定日期值的小时开始时间。我在 2012 年 11 月 4 日星期日(东部时区 - EDT 到 EST 切换)遇到了以下问题:

public void testStartOfHourDST1() {

Calendar cal = Calendar.getInstance();

long time = 1352005200000L; // Nov 4, 2012, 1AM EDT
cal.setTimeInMillis(time);

cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);

System.out.println(new Date(time));
System.out.println(new Date(cal.getTimeInMillis()));
System.out.println(System.getProperty("java.version"));

assertEquals(cal.getTimeInMillis(), time); // fails

return;
}

输出:

Sun Nov 04 01:00:00 EDT 2012

Sun Nov 04 01:00:00 EST 2012

1.6.0_35

也许这不是使用日历的正确方法,但在下一个小时(或前一个小时)运行相同的测试工作正常。这是 JVM 问题吗?

谢谢

最佳答案

这并不是一个真正的问题,因为它是确定性的并且按照编程的方式进行。如果您希望它选择两个凌晨 1 点中较早的一个,这是一个问题!

更改日历上的字段后,它拥有的唯一信息是“美国/东部凌晨 1 点”。好吧,那天你的时区有两个凌晨 1 点,它应该选择哪一个? OpenJDK 的作者做出了一个决定,当出现这种歧义时,他们总是将其解释为标准时间中的后者。此注释来自 java.util.GregorianCalendar OpenJDK 6:

    // 2. The transition out of DST.  Here, a designated time of 1:00 am - 1:59 am
// can be in standard or DST. Both are valid representations (the rep
// jumps from 1:59:59 DST to 1:00:00 Std).
// Again, we assume standard time.

如果您打印出数字的实际值,您将看到 cal.getTimeInMillis() 实际上已从 time 的值更改了一个小时。

关于Java 日历 : 1am switchover to standard time (from DST),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13279622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com