【问题标题】:Why Java localDateTime does not recognize Canada/Yukon as GMT-7?为什么 Java localDateTime 不将加拿大/育空地区识别为 GMT-7?
【发布时间】:2022-02-07 09:51:33
【问题描述】:

加拿大/育空时区不再遵守 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]。

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

【问题讨论】:

标签: java time timezone


【解决方案1】:

确实是,Yukon time zone rules changed 在 2020 年初。那里的政客们决定无限期地留在Daylight Saving Time (DST),使用全年 -07:00 的偏移量。所以中午太阳永远不会再出现在头顶。

全年保持 DST 是世界各地政界人士的新时尚。 MoroccoTurkey 等国家/地区已采用这种方式。其他人正朝着这个方向前进,such as Washington State 在美国。

您的代码:

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

……过度劳累了。只需在输入字符串的末尾加上 Z,如果该日期和时间是 UTC 格式的时刻。

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

你问:

这是否意味着当某些时区决定不遵守夏令时或决定永久提前时,java.time 库不会更新?

世界各地的政治家都表现出对改变其管辖范围内的时区规则的偏好。他们以惊人的频率这样做。有些人这样做时几乎没有预先警告。

规则存储在tzdata 文件中。当政客改变规则时,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

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2011-01-04
    • 2017-03-23
    • 1970-01-01
    • 2016-04-03
    • 2013-06-12
    相关资源
    最近更新 更多