背景
近日,在项目中,测试反馈了在格陵兰岛地区时间本地化有问题,接口返回时间和当地实际时间不匹配。
如在 time.is 网站(https://time.is/zh/Greenland)中当前显示显示时间为 2024-05-25 04:43 。

但是程序返回的却是 2024-05-25 03:43

分析
Java代码如下
IANA时区ID和夏令时显示都是正常的。

将代码中的时区相关信息打印,可以看到异常点:代码中使用的 America/Nuuk 时区ID偏移量为-3,而格陵兰岛当前实际应为UTC-2。

通过【Time zone change in Greenland】和格陵兰岛政府文件【关于格陵兰岛标准时间变更的公告】可以知道,格陵兰岛在2023年由UTC-3时区改为了UTC-2时区。



所以应该是Java中的时区数据库版本没有更新导致这一差异。
可以通过代码查看当前使用的JDK版本中的时区数据库版本信息。
可以看到,当前我使用的JDK版本时区数据库版本为 2021a ,肯定是没有格陵兰岛2023年发布的这一政令改动。

更新时区数据库
在【Timezone Data Versions in the Java Runtime】中,可以查看到最新的Java时区数据库版本和改动相关信息。除了格陵兰岛,还有很多地区因为各种原因也是有时区的改动的。

Java 的
TimeZone.getTimeZone 方法依赖于时区数据库,该数据库通常包含在 Java 运行时环境(JRE)中。这个时区数据库通常被称为 "tz database" 或 "Olson database"。时区数据库通常包含在 JRE 的
lib 目录中。
Oracle 提供了一个名为
TZUpdater 的工具,用于更新 JRE 中的时区数据。该工具可以从 IANA 时区数据库下载最新的时区信息并更新到 JRE 中。
下载后解压,使用Java运行jar
使用
java -jar tzupdater.jar -V 命令可以查看当前Java中的tz数据库版本和可升级的最新版本使用
java -jar tzupdater.jar -l 命令可以升级当前环境的时区数据库版本

重新跑下格陵兰岛当前时间,可以看到时区偏移是正确的了。代码中获取时区数据库版本也为最新。

通过定期更新时区数据库,可以确保 Java 应用程序在全球范围内的时间处理都准确无误,从而提高应用程序的可靠性和用户满意度。
感谢阅读!如果文章内容有失误地方,请留言与我联系。
- 作者:Yibin
- 链接:https://yibin.dev/article/5b752a88-3da2-4325-a67d-17dadcf61f3a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章









