作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些代码使用 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/
我有一些代码使用 Calendar.set() 返回给定日期值的小时开始时间。我在 2012 年 11 月 4 日星期日(东部时区 - EDT 到 EST 切换)遇到了以下问题: public voi
我是一名优秀的程序员,十分优秀!