Java 8中关于澳大利亚/墨尔本时区的日期时间夏令时问题

4

我在夏令时开始和结束时得到了不同的结果。

ZoneId zone = ZoneId.of("Australia/Melbourne");
System.out.println(ZonedDateTime.of(2019, 04, 07, 3, 0, 0, 0, zone)); // statement-1
System.out.println(ZonedDateTime.of(2019, 10, 06, 2, 0, 0, 0, zone)); // statement-2

2019年夏令时的前半段,我的结果是(2019-04-07T03:00+10:00[澳大利亚/墨尔本])。Java减少1小时偏移量,但是在夏令时的后半段(statement-2=> 2019-10-06T03:00+11:00[澳大利亚/墨尔本])中,Java会将时间增加1小时,并将偏移值加1。据我所知,Java应该在夏令时开始时从时间和偏移值中减去1小时,并在夏令时结束时将其增加1小时和1小时偏移值。请帮我澄清这些差异。这是Java 8的问题还是我的理解有误?
1个回答

7
查看澳大利亚/墨尔本的夏令时转换,由于夏令时更改,2019年10月6日从未出现过02:00。 夏令时的工作原理是:在01:59:59.999999之后,时钟会跳转到03:00:00.000000。
这在ZonedDateTime.of javadoc中有所记录:

在跳跃式更改时间时(例如由冬令时转为夏令时),不存在有效偏移量。 取而代之的是,将本地日期时间调整为距离间隔长度更晚的时间。 对于典型的一小时夏令时更改,本地日期时间将向后移动一小时,进入通常对应于“夏季”的偏移量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接