Java 8 分区日期时间->;在(zd1(第2小时),zd2(第1小时))之间返回-2

Java 8 分区日期时间->;在(zd1(第2小时),zd2(第1小时))之间返回-2,java-8,dst,java-time,date-difference,zoneddatetime,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); Zoned

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


如果有人能帮我更好地理解这一点,我将不胜感激。

当您查看
ZoneDateTime
对象时,您会看到:

zd1 = '2015-11-01T02:00-05:00[US/Eastern]'
zd2 = '2015-11-01T01:00-04:00[US/Eastern]'

夏时制于2015年11月1日结束。凌晨1点发生在时钟倒转之前,凌晨2点发生在时钟倒转之后。因此两个小时的差异。

当您查看
ZoneDateTime
对象时,您会看到:

zd1 = '2015-11-01T02:00-05:00[US/Eastern]'
zd2 = '2015-11-01T01:00-04:00[US/Eastern]'

夏时制于2015年11月1日结束。凌晨1点发生在时钟倒转之前,凌晨2点发生在时钟倒转之后。因此两个小时的差异。

美国/东部
,in(这些名字的来源)与
美国/纽约
时区相同(检查以检查等效性-搜索
美国/东部

美国/纽约
时区:凌晨2点,时钟向后移动1小时至凌晨1点,偏移量从
-04:00
更改为
-05:00

如果您检查
ZoneDateTime
,您将看到偏移量的变化:

System.out.println(zd1);
System.out.println(zd2);
输出为:

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

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

System.out.println(zd1.toInstant());
System.out.println(zd2.toInstant());
2015-11-01T07:00:00Z
2015-11-01T05:00:00Z

请注意,这些日期之间的差异为2小时。您可以在
zd2
中添加1小时和2小时来检查这一点:

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[美国/东部]

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

这不会发生在您的第二次测试中,因为在DST更改发生后,两个日期处于相同的偏移量(
-05:00
)。因此,差别仅为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


请注意,偏移量是相同的,通过相应的UTC
Instant
我们可以看到差异仅为1小时。

美国/东部
,in(这些名称来自的来源)与
美国/纽约
时区相同(检查以检查等效性-搜索
美国/东部

美国/纽约
时区:凌晨2点,时钟向后移动1小时至凌晨1点,偏移量从
-04:00
更改为
-05:00

如果您检查
ZoneDateTime
,您将看到偏移量的变化:

System.out.println(zd1);
System.out.println(zd2);
输出为:

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

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

System.out.println(zd1.toInstant());
System.out.println(zd2.toInstant());
2015-11-01T07:00:00Z
2015-11-01T05:00:00Z

请注意,这些日期之间的差异为2小时。您可以在
zd2
中添加1小时和2小时来检查这一点:

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[美国/东部]

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

这不会发生在您的第二次测试中,因为在DST更改发生后,两个日期处于相同的偏移量(
-05:00
)。因此,差别仅为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


请注意,偏移量是相同的,通过相应的UTC
瞬间
,我们可以看到差异仅为1小时。

当第三个示例与第二个示例完全相同时,如何从第三个示例中获得
1
?通过微观研究,即打印
zd1
zd2
的值,你应该知道答案。那是夏令时:-时钟向后移动1小时,所以两个小时之间已经过去了。您可以通过验证每个日期的相应时刻来检查这一点:
zd1.toInstant()
将为您提供UTC时刻,您将看到差异为2小时。当第三个示例与第二个示例完全相同时,您如何从第三个示例中获得
1
,例如,打印
zd1
zd2
的值,您就知道答案了。这就是夏令时:-时钟向后移动1小时,因此两个时间间隔已经过去了2小时。您可以通过验证每个日期的相应时刻来检查这一点:
zd1.toInstant()
将为您提供UTC时刻,您将看到差异为2小时