夏令时结束于11月1日凌晨2点(美国/东部时区)。结果,2 AM变成1 AM。
在下面给出的代码中,我无法理解以下内容:
为什么第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]
有人可以帮我吗?
答案 0 :(得分:4)
请参阅Duration和Period上的完整Java文档,始终可以快速进行Google搜索。
来自持续时间:
此外,可以使用DAYS单位并将其视为完全相等 到24小时,因此忽略了夏令时的影响。见期间 基于日期的等效于此类。
自期间:
对夏令时的时间和期限有所不同 添加到ZonedDateTime的时间。持续时间将添加确切的数字 秒的持续时间,因此一天的持续时间总是恰好是24小时。通过 相比之下,“期间”会增加一个概念性的日子,试图维持 当地时间
因此,Period
将保持相同的小时,而持续时间将增加24小时。
10月31日10:00以后的24小时是11月1日9:00。
答案 1 :(得分:4)
持续时间::尽管ofDays
方法Duration
没有几天的概念。 Duration.ofDays(1)
将立即转换为24小时,因此这就是您要添加的内容。由于您将DST结束前一天的24小时加到10:00,因此您观察到的第二天为09:00,
期限:与Duration
和Period
相反,它知道几天,几周,几个月和几年。因此,您要添加1个日历日,第二天(10:00)会达到相同的挂钟时间,即使这意味着25小时后(而不是24小时)。