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

Posted

技术标签:

【中文标题】澳大利亚/墨尔本时区的 Java 8 中的日期时间夏令时问题【英文标题】:Date time day light saving issue in java 8 for time zone Australia/Melbourne 【发布时间】:2020-07-08 04:27:01 【问题描述】:

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

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**[Australia/Melbourne])。 Java 正在减少 1 小时来抵消价值。但是对于夏令时的后半部分(statement-2=> 2019-10-06T03:00+11:00[Australia/Melbourne]),java 增加了 1 小时和 +1来抵消价值。

根据我的理解,java 应该增加 1 小时和 +1 到偏移值(DST 结束),而当 DST 开始时,java 应该从时间减少 1 小时,从偏移值减少 1。

请帮助我澄清这些差异。是java 8的问题还是我的理解不正确?

【问题讨论】:

【参考方案1】:

查看DST transitions for Australia/Melbourne,由于 DST 更改,时钟从未在 2019 年 10 月 6 日 02:00。这就是 DST 的工作原理:在 01:59:59.999999 之后,时钟跳到 03:00:00.000000。

这记录在ZonedDateTime.of javadoc:

在间隙的情况下,当时钟向前跳时,没有有效的偏移量。相反,本地日期时间会根据间隙的长度进行调整。对于典型的一小时夏令时更改,本地日期时间将在一小时后移动到通常对应于“夏季”的偏移量中。

【讨论】:

以上是关于澳大利亚/墨尔本时区的 Java 8 中的日期时间夏令时问题的主要内容,如果未能解决你的问题,请参考以下文章

时区缩写

2018年自然语言处理及相关国际会议重要日期整理

UTC 时间、时区、夏令时和夏令时切换日期

欣赏▏Ruby Rose

Python strptime() 和时区?

时区缩写