ZonedDateTime - > ChronoUnit.HOURS.between(zd1(小时2),zd2(小时1))返回-2

时间:2017-07-30 06:14:47

标签: java-8 dst java-time date-difference zoneddatetime

我试图理解为什么代码的结果是-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

如果有人可以帮助我更好地理解这一点,真的很感激。

2 个答案:

答案 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)

IANA database中的this list(这些名称来自的来源)与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小时。