我从乔达(Joda)的时间开始奇怪的行为,试图从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开关日。开关发生在凌晨2点至3点之间。如果我没记错的话,夏季时间是UTC 2,冬季是UTC 1,所以在凌晨3点,钟回到了凌晨2点。
。现在,这显然意味着2-3的重叠,但是我的测试使用了1点和上午10点,这应该是明确的。我希望10月30日的瞬间,CEST是午夜以来的3600秒,而10月30日的即时,CET是自午夜(11小时)以来的39600秒。但是GeteCondofDay()自午夜以来返回10个小时。
我能想象的唯一含义(除了一个愚蠢的错误)是getecondofday()自午夜以来实际上并没有返回几秒钟,而是其他东西。但是,我在网上发现的每个示例似乎都暗示 do 返回午夜以来的秒数。我所知道的"午夜"没有与DST相关的重新定义。
为什么我会得到这些结果?在这种情况下,GeteCondofDay()是什么意思?自午夜以来,我还应该做什么才能获得秒数?
字段second_of_day固有地基于本地时间轴。这意味着,它不计算午夜以来物理经过的si-或posix-seconds在壁钟上显示的时钟打击的名义计数,每天夜间周期总是有24个小时/罢工,忽略了任何DST时。或另一个描述:试想一下此字段显示二手在时钟面上的位置。
但是您可以以另一种方式确定物理经过的秒数。DateTime
类是瞬间,因此您可以首先确定午夜的瞬间,然后确定第二次在上午10点的瞬间。然后,您应用此表达式:
int elapsedSecondsSinceMidnight =
Seconds.secondsBetween(instantMidnight, instant10AM).getSeconds();
请注意,如果由于DST-Switch而不存在此当地时间,Joda Time有时会导致当地午夜的瞬间(例如在巴西转移到夏季时)。因此,请谨慎处理Joda Time的Instants。