在夏令时前后将 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 点。
我无法理解下面给出的代码中的以下内容:
- 为什么第 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]
有人可以帮我吗?
查看关于 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。
- 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
持续时间: 尽管使用 ofDays
方法 Duration
还没有天数的概念。 Duration.ofDays(1)
会立即转换为 24 小时,所以这就是您要添加的内容。由于您在 DST 结束前一天将 24 小时添加到 10:00,因此您在第二天会得到 09:00,正如您观察到的那样,
期间: 与 Duration
相反,Period
知道天、周、月和年。所以你要添加 1 个日历日,在第二天达到相同的挂钟时间 (10:00),即使这意味着 25 小时后(而不是 24 小时)。
夏令时在 US/Eastern 时区的 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]
有人可以帮我吗?
查看关于 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。
- 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
持续时间: 尽管使用 ofDays
方法 Duration
还没有天数的概念。 Duration.ofDays(1)
会立即转换为 24 小时,所以这就是您要添加的内容。由于您在 DST 结束前一天将 24 小时添加到 10:00,因此您在第二天会得到 09:00,正如您观察到的那样,
期间: 与 Duration
相反,Period
知道天、周、月和年。所以你要添加 1 个日历日,在第二天达到相同的挂钟时间 (10:00),即使这意味着 25 小时后(而不是 24 小时)。