夏令时前后将 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 2
是Period
和line 4
是Duration
。谢谢。【参考方案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 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章