0

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

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

4

2 回答 2

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 点发生在时钟倒退之后。因此两个小时的差异。

于 2017-07-30T06:20:39.893 回答
1

US/Eastern,在IANA 数据库(这些名称的来源)中与America/New_York时区相同(检查此列表以检查等价性 - 搜索US/Eastern)。

America/New_York时区,夏令时于 2015 年 11 月 1 日结束:凌晨2 点,时钟向后移动 1 小时到凌晨 1 点,偏移量从-04:00变为-05:00

如果你检查ZonedDateTime's,你会看到偏移量变化:

System.out.println(zd1);
System.out.println(zd2);

输出是:

2015-11-01T02:00-05:00[美国/东部]
2015-11-01T01:00-04:00[美国/东部]

如果您看到相应的Instant,您将看到 UTC 中的两个日期:

System.out.println(zd1.toInstant());
System.out.println(zd2.toInstant());

2015-11-01T07:00:00Z
2015-11-01T05:00:00Z

请注意,这些日期之间的差异是 2 小时。您可以通过添加 1 和 2 小时来检查zd2

System.out.println(zd2);
System.out.println(zd2.plusHours(1));
System.out.println(zd2.plusHours(2));

输出是:

2015-11-01T01:00-04:00[美国/东部]
2015-11-01T01:00-05:00[美国/东部]
2015-11-01T02:00-05:00[美国/东部]

因此,从凌晨 1 点开始偏移量-04:00,1 小时后您在凌晨 2 点偏移量-04:00,但由于 DST 更改,时钟移回凌晨 1 点偏移量-05:00。然后,1 小时后,您在偏移量05:00( zd1) 的凌晨 2 点。这就是为什么相差2小时。

这在您的第二次测试中不会发生,因为-05:00在 DST 更改发生后,两个日期都在相同的偏移量 ( ) 中。所以,相差只有1小时。您可以通过打印日期和相应的内容再次检查Instant

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"));
System.out.println(zd1);
System.out.println(zd2);
System.out.println(zd1.toInstant());
System.out.println(zd2.toInstant());

2015-11-01T02:00-05:00[美国/东部]
2015-11-01T03:00-05:00[美国/东部]
2015-11-01T07:00:00Z
2015-11-01T08:00:00Z

注意偏移量是一样的,通过对应的UTCInstant我们可以看出相差只有1小时。

于 2017-07-31T12:19:46.730 回答