为什么 Java localDateTime 无法将 Canada/Yukon 识别为 GMT-7?

Why Java localDateTime does not recognize Canada/Yukon as GMT-7?

Canada/Yukon 时区不再遵守 DST(来源 https://www.timeanddate.com/time/change/canada/yukon),现在永久为 GMT-7。但是当我尝试这个时:

ZonedDateTime nowZoned = LocalDateTime.parse("2021-02-03T08:04:00").atZone(ZoneOffset.UTC).toInstant().atZone(ZoneId.of("Canada/Yukon"));

nowZoned 显示为 2021-02-03T00:04-08:00[Canada/Yukon]。

这是否意味着 java.time 库在某些时区决定不遵守 DST 或决定永久提前时钟时不会更新?有哪些方法可以解决此问题?我考虑过手动检查这些,但是时区太多了,无法手动处理它们。谢谢!

确实如此,Yukon time zone rules changed in early 2020. The politicians there decided to stay on Daylight Saving Time (DST) 无限期地使用 -07:00 year-round 的偏移量。所以中午太阳再也不会在头顶上了。

坚持夏令时 year-round 是全球政治家的新时尚。美国Morocco and Turkey have gone that way. Others are headed that way, such as Washington State等国家

您的代码:

ZonedDateTime nowZoned = LocalDateTime.parse("2021-02-03T08:04:00").atZone(ZoneOffset.UTC).toInstant().atZone(ZoneId.of("Canada/Yukon"));

……过度劳累。如果该日期和时间是 UTC 中看到的时刻,只需在输入字符串的末尾放置一个 Z

ZonedDateTime zdt = 
    Inatant
    .parse("2021-02-03T08:04:00Z")
    .atZone(
        ZoneId.of( "Canada/Yukon" )
    )
;

你问过:

Does it mean that java.time library does not update when some timezones have decided not to observe DST or decided to move ahead of the clock permanently?

世界各地的政客都表现出倾向于改变其管辖范围内的时区规则。他们以惊人的频率这样做。有些人这样做的预警少得惊人。

规则存储在 tzdata file. When politicians change the rules, ICANN/IANA 发布的新更新版本的 tzdata 中。这种情况通常每年发生几次。

而且,不,您的计算机上没有自动立即更新。作为系统管理员或 DBA,您负责这些更新。当然,除非贵公司感兴趣的时区发生变化,否则您无需更新。

你会在你的机器上找到至少两三个这样的东西。

  • 您的 JVM 嵌入了一个。 JVM 的更新通常包括最新的 tzdata。但是 Java 更新可能还不够快。因此,您可能需要手动获取一个 tzdata 文件,并替换 JVM 中的文件。 Oracle provides a tool 协助。但我不知道其当前的许可条款,因此请研究他们的条款。或者咨询您的 JVM 供应商,例如 Azul Systems、Adoptium、SAP、Amazon、Microsoft、BellSoft、Red Hat/IBM 等
  • 您的主机操作系统,例如 macOS、BSD、Linux、Windows 等,具有 tzdata 的副本。虽然更新此 tzdata 不会影响您的 Java 应用,但您需要为其他应用更新它。
  • 复杂的数据库服务器,例如 Postgres,也保留了自己的 tzdata 内部副本。根据需要通过手动替换或通过更新版本的 DBMS 进行更新。

每个系统管理员和 DBA 都应该考虑订阅 tzdata announcement mailing list