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

Posted

技术标签:

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

夏令时在美国/东部时区的 11 月 1 日凌晨 2 点结束。结果,凌晨 2 点变成了凌晨 1 点。

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

    为什么第 2 行显示时间 09:00,为什么不显示 10:00(增加 1 天)?

    为什么第 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 小时是两个不同的东西。 【参考方案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】:

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

从持续时间:

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

从时间:

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

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

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

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

【讨论】:

这里你也很困惑,@skip。 :-) 答案是正确的。

以上是关于夏令时前后将 Duration.ofDays(1) 和 Period.ofDays(1) 添加到 ZonedDateTime 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

前后端解析时间戳得到的时间不一样

SQL Server 2008 函数将 GMT 时间转换为 AEST 并采用夏令时

1小时时差夏令时问题

检查夏令时是不是有效?

如何添加关于夏令时时区的每周时间增量

R方法通过将整个数据集向上移动一个小时/向下移动一个小时半年来将标准转换为夏令时?