在夏令时前后将 Duration.ofDays(1) 和 Period.ofDays(1) 添加到 ZonedDateTime 之间的区别

Difference between adding Duration.ofDays(1) and Period.ofDays(1) to ZonedDateTime around Daylight Savings Time

夏令时在 US/Eastern 时区的 11 月 1 日凌晨 2 点结束。结果,凌晨 2 点变成凌晨 1 点。

我无法理解下面给出的代码中的以下内容:

  1. 为什么第 2 行显示时间 09:00,为什么不显示 10:00(加上 1 天)?
  2. 为什么第 4 行显示时间 10:00,为什么不显示 09:00(加上 24 小时)?

    LocalDateTime ld = LocalDateTime.of(2015, Month.OCTOBER, 31, 10, 0);
    
    ZonedDateTime date = ZonedDateTime.of(ld, ZoneId.of("US/Eastern"));
    System.out.println(date);       //line 1 - 2015-10-31T10:00-04:00[US/Eastern]
    
    date = date.plus(Duration.ofDays(1));
    System.out.println(date);       //line 2 - 2015-11-01T09:00-05:00[US/Eastern]
    
    date = ZonedDateTime.of(ld, ZoneId.of("US/Eastern"));
    System.out.println(date);       //line 3 - 2015-10-31T10:00-04:00[US/Eastern]
    
    date = date.plus(Period.ofDays(1));
    System.out.println(date);       //line 4 - 2015-11-01T10:00-05:00[US/Eastern]
    

有人可以帮我吗?

查看关于 Duration and Period 的完整 Java 文档,总是一次快速 Google 搜索。

从持续时间:

In addition, the DAYS unit can be used and is treated as exactly equal to 24 hours, thus ignoring daylight savings effects. See Period for the date-based equivalent to this class.

从期间:

Durations and periods differ in their treatment of daylight savings time when added to ZonedDateTime. A Duration will add an exact number of seconds, thus a duration of one day is always exactly 24 hours. By contrast, a Period will add a conceptual day, trying to maintain the local time

因此,Period 将保持同一小时,而 Duration 将增加 24 小时。

10 月 31 日 10:00 后 24 小时是 11 月 1 日 9:00。

  1. 11:00
  2. 12:00
  3. 13:00(下午 1 点)
  4. 14:00
  5. 15:00
  6. 16:00
  7. 17:00
  8. 18:00
  9. 19:00
  10. 20:00
  11. 21:00
  12. 22:00
  13. 23:00
  14. 0:00(午夜)
  15. 1:00
  16. 1:00(这是额外的一小时)
  17. 2:00
  18. 3:00
  19. 4:00
  20. 5:00
  21. 6:00
  22. 7:00
  23. 8:00
  24. 9:00

持续时间: 尽管使用 ofDays 方法 Duration 还没有天数的概念。 Duration.ofDays(1) 会立即转换为 24 小时,所以这就是您要添加的内容。由于您在 DST 结束前一天将 24 小时添加到 10:00,因此您在第二天会得到 09:00,正如您观察到的那样,

期间:Duration 相反,Period 知道天、周、月和年。所以你要添加 1 个日历日,在第二天达到相同的挂钟时间 (10:00),即使这意味着 25 小时后(而不是 24 小时)。