我试图理解为什么代码的结果是-2,最初我认为它应该是-1,但是这个让我很困惑
LocalDateTime ld1 = LocalDateTime.of(2015, Month.NOVEMBER, 1, 2, 0);
ZonedDateTime zd1 = ZonedDateTime.of(ld1, ZoneId.of("US/Eastern"));
LocalDateTime ld2 = LocalDateTime.of(2015, Month.NOVEMBER, 1, 1, 0);
ZonedDateTime zd2 = ZonedDateTime.of(ld2, ZoneId.of("US/Eastern"));
long x = ChronoUnit.HOURS.between(zd1, zd2);
System.out.println(x);
输出:-2
LocalDateTime ld1 = LocalDateTime.of(2015, Month.NOVEMBER, 1, 3, 0);
ZonedDateTime zd1 = ZonedDateTime.of(ld1, ZoneId.of("US/Eastern"));
LocalDateTime ld2 = LocalDateTime.of(2015, Month.NOVEMBER, 1, 2, 0);
ZonedDateTime zd2 = ZonedDateTime.of(ld2, ZoneId.of("US/Eastern"));
long x = ChronoUnit.HOURS.between(zd1, zd2);
System.out.println(x);
以下是结果如我预期的那样有效的例子!
输出:-1
LocalDateTime ld1 = LocalDateTime.of(2015, Month.NOVEMBER, 1, 2, 0);
ZonedDateTime zd1 = ZonedDateTime.of(ld1, ZoneId.of("US/Eastern"));
LocalDateTime ld2 = LocalDateTime.of(2015, Month.NOVEMBER, 1, 3, 0);
ZonedDateTime zd2 = ZonedDateTime.of(ld2, ZoneId.of("US/Eastern"));
long x = ChronoUnit.HOURS.between(zd1, zd2);
System.out.println(x);
输出:1
如果有人可以帮助我更好地理解这一点,真的很感激。
答案 0 :(得分:2)
当您查看ZonedDateTime
个对象时,您会看到以下内容:
zd1 = '2015-11-01T02:00-05:00[US/Eastern]'
zd2 = '2015-11-01T01:00-04:00[US/Eastern]'
夏令时于2015年11月1日结束。凌晨1点发生在时钟回归之前,凌晨2点发生在时钟回归之后。因此有两个小时的差异。
答案 1 :(得分:1)
US/Eastern
时区相同(检查Daylight Saving Time ended at November 1st 2015以检查等效性 - 搜索{{ 1}})。
在America/New_York
时区,Java tutorial for beginners:凌晨2点,时钟向后移动1小时到凌晨1点,偏移量从US/Eastern
更改为America/New_York
。
如果您查看-04:00
,则会看到偏移更改:
-05:00
输出结果为:
2015-11-01T02:00-05:00 [US /东]
2015-11-01T01:00-04:00 [US /东]
如果您看到相应的ZonedDateTime
,则会在UTC中看到这两个日期:
System.out.println(zd1);
System.out.println(zd2);
2015-11-01T07:00:00Z
2015-11-01T05:00:00Z
请注意,这些日期之间的差异是2小时。您可以通过向Instant
添加1小时和2小时来检查这一点:
System.out.println(zd1.toInstant());
System.out.println(zd2.toInstant());
输出结果为:
2015-11-01T01:00-04:00 [US /东]
2015-11-01T01:00-05:00 [US /东]
2015-11-01T02:00-05:00 [US /东]
因此,从偏移zd2
的凌晨1点开始,1小时后您在偏移System.out.println(zd2);
System.out.println(zd2.plusHours(1));
System.out.println(zd2.plusHours(2));
的凌晨2点,但由于DST的变化,时钟在偏移{{1 }}。然后,1小时后,您在偏移-04:00
(-04:00
)的凌晨2点。这就是差异为2小时的原因。
在第二次测试中不会发生这种情况,因为在DST发生更改后,两个日期都处于相同的偏移量(-05:00
)。所以,差异只有1个小时。您可以通过打印日期和相应的05:00
:
zd1
2015-11-01T02:00-05:00 [US /东]
2015-11-01T03:00-05:00 [US /东]
2015-11-01T07:00:00Z
2015-11-01T08:00:00Z
请注意,偏移量是相同的,通过相应的UTC -05:00
,我们可以看到差异只有1小时。