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

时间:2018-11-13 18:52:34

标签: java datetime java-8 dst zoneddatetime

夏令时结束于11月1日凌晨2点(美国/东部时区)。结果,2 AM变成1 AM。

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

  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]
    

有人可以帮我吗?

2 个答案:

答案 0 :(得分:4)

请参阅DurationPeriod上的完整Java文档,始终可以快速进行Google搜索。

来自持续时间:

  

此外,可以使用DAYS单位并将其视为完全相等   到24小时,因此忽略了夏令时的影响。见期间   基于日期的等效于此类。

自期间:

  

对夏令时的时间和期限有所不同   添加到ZonedDateTime的时间。持续时间将添加确切的数字   秒的持续时间,因此一天的持续时间总是恰好是24小时。通过   相比之下,“期间”会增加一个概念性的日子,试图维持   当地时间

因此,Period将保持相同的小时,而持续时间将增加24小时。

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

  1. 11:00
  2. 12:00
  3. 13:00(1 pm)
  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

答案 1 :(得分:4)

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

期限:与DurationPeriod相反,它知道几天,几周,几个月和几年。因此,您要添加1个日历日,第二天(10:00)会达到相同的挂钟时间,即使这意味着25小时后(而不是24小时)。