【问题标题】:Difference between adding Duration.ofDays(1) and Period.ofDays(1) to ZonedDateTime around Daylight Savings Time夏令时前后将 Duration.ofDays(1) 和 Period.ofDays(1) 添加到 ZonedDateTime 之间的区别
【发布时间】:2019-04-16 16:23:25
【问题描述】:

夏令时在美国/东部时区的 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]
    

有人可以帮我吗?

【问题讨论】:

  • 1 天和 24 小时是两个不同的东西。

标签: java datetime java-8 dst zoneddatetime


【解决方案1】:

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

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

【讨论】:

  • 如果持续时间增加 24 小时,是否应该不给第二天 09:00(考虑 DST)?同样,是否应该添加一天(1 天)给我们第二天 10:00?我得到的答案是相反的。 Duration.ofDays(1) 给 10:00,而Period.ofDays(1) 给 09:00。
  • 你现在是不是很困惑? 如果持续时间增加了 24 小时,它不应该是第二天 09:00(考虑 DST)吗? 是的,这也是您在收到的问题中报告的内容。 同样,增加一天(1 天期间)是否应该在第二天给我们 10:00? 是的,你的问题表明这正是你得到的。
  • 你是对的。看起来我已经看到并阅读了 Period.ofDays(1)Duration.ofDays(1)Duration.ofDays(1) 作为 Period.ofDays(1)。即使在我的问题中,我也做了同样的事情。我以为line 2Periodline 4Duration。谢谢。
【解决方案2】:

DurationPeriod 上查看完整的 Java 文档,只需一次快速的 Google 搜索即可。

从持续时间:

此外,可以使用 DAYS 单位并被视为完全相等 到 24 小时,因此忽略了夏令时的影响。请参阅期间 这个类的基于日期的等价物。

从时间:

持续时间和期间对夏令时的处理方式不同 添加到 ZonedDateTime 的时间。 A Duration 将添加一个确切的数字 秒,因此一天的持续时间始终是 24 小时。经过 相比之下,一个 Period 将添加一个概念日,试图保持 当地时间

因此,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

【讨论】:

  • 这里你也很困惑,@skip。 :-) 答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2022-10-01
  • 2018-07-06
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2018-05-05
相关资源
最近更新 更多