我是从约达时间试图让秒钟,因为午夜在DST开关一天,当遇到奇怪的行为。
我的代码:
public static void main(String[] args) {
DateTimeZone timeZone = DateTimeZone.getDefault();
System.out.println(timeZone);
DateTimeFormatter dateFormatter = DateTimeFormat.shortDate();
DateTimeFormatter dateTimeFormatter = DateTimeFormat.fullDateTime();
LocalDate date = new LocalDate(2016, 10, 29);
for (int i=0; i<3; i++) {
System.out.println();
System.out.println(dateFormatter.print(date) + ":");
{
DateTime instant = new DateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), 1, 0, 0, timeZone);
System.out.println(dateTimeFormatter.print(instant) + " // " + instant.getSecondOfDay() + " // " + instant.getZone().getOffset(instant));
}
{
DateTime instant = new DateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), 10, 0, 0, timeZone);
System.out.println(dateTimeFormatter.print(instant) + " // " + instant.getSecondOfDay() + " // " + instant.getZone().getOffset(instant));
}
date = date.plusDays(1);
}
}
输出:
Europe/Berlin
29.10.16:
Samstag, 29. Oktober 2016 01:00 Uhr MESZ // 3600 // 7200000
Samstag, 29. Oktober 2016 10:00 Uhr MESZ // 36000 // 7200000
30.10.16:
Sonntag, 30. Oktober 2016 01:00 Uhr MESZ // 3600 // 7200000
Sonntag, 30. Oktober 2016 10:00 Uhr MEZ // 36000 // 3600000
31.10.16:
Montag, 31. Oktober 2016 01:00 Uhr MEZ // 3600 // 3600000
Montag, 31. Oktober 2016 10:00 Uhr MEZ // 36000 // 3600000
(翻译德国:MEZ = CET,MESZ = CEST)
正如你可以看到,10月30日是DST开关的一天。 发生切换AM 2和3之间。 如果我没有记错的话,夏天的时候是UTC + 2,冬季时间为UTC + 1,所以凌晨3点,时钟转身到凌晨2点。
现在,这显然意味着2-3的重叠,但我的测试使用1点和上午10点,这应该是明确的。 我期望即时在10月30日,凌晨1点CEST是因为午夜3600秒,即时在10月30日,上午10点CET是自午夜39600秒(11小时)。 但getSecondOfDay()从午夜开始返回10个小时。
我能想象(除了一个愚蠢的错误)唯一的含义是,getSecondOfDay()实际上并没有因为午夜返回秒,但别的东西。 然而,我在网上找到的每个例子似乎暗示,因为午夜,它并返回的秒数。 有“子夜”,我知道没有DST相关的重新定义,无论是。
为什么我得到这些结果? 什么是getSecondOfDay()意味着在这种情况下怎么办? 还有什么我应该做的就是自午夜起的秒数?