为了账号安全,请及时绑定邮箱和手机立即绑定

夏令时前后将 Duration.ofDays(1) 和 Period.ofDays(1)

夏令时前后将 Duration.ofDays(1) 和 Period.ofDays(1)

杨__羊羊 2022-01-19 15:35:19
美国/东部时区的夏令时于 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]有人可以帮我吗?
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2022-01-19
?
开满天机

TA贡献1786条经验 获得超13个赞

请参阅有关Duration和Period的完整 Java 文档,只需一次快速的 Google 搜索即可。


从持续时间:


此外,可以使用 DAYS 单位并将其视为正好等于 24 小时,从而忽略夏令时的影响。有关此类的基于日期的等效项,请参见期间。


从期间:


当添加到 ZonedDateTime 时,持续时间和期间对夏令时的处理有所不同。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


查看完整回答
反对 回复 2022-01-19
  • 2 回答
  • 0 关注
  • 544 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号