背景

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

分析

Java代码如下
IANA时区ID和夏令时显示都是正常的。
notion image
将代码中的时区相关信息打印,可以看到异常点:代码中使用的 America/Nuuk 时区ID偏移量为-3,而格陵兰岛当前实际应为UTC-2。
notion image
通过【Time zone change in Greenland】和格陵兰岛政府文件【关于格陵兰岛标准时间变更的公告】可以知道,格陵兰岛在2023年由UTC-3时区改为了UTC-2时区。
notion image
notion image
notion image
所以应该是Java中的时区数据库版本没有更新导致这一差异。
可以通过代码查看当前使用的JDK版本中的时区数据库版本信息。
可以看到,当前我使用的JDK版本时区数据库版本为 2021a ,肯定是没有格陵兰岛2023年发布的这一政令改动。
notion image

更新时区数据库

在【Timezone Data Versions in the Java Runtime】中,可以查看到最新的Java时区数据库版本和改动相关信息。除了格陵兰岛,还有很多地区因为各种原因也是有时区的改动的。
notion image
Java 的 TimeZone.getTimeZone 方法依赖于时区数据库,该数据库通常包含在 Java 运行时环境(JRE)中。这个时区数据库通常被称为 "tz database" 或 "Olson database"。
时区数据库通常包含在 JRE 的 lib 目录中。
notion image
 
Oracle 提供了一个名为 TZUpdater 的工具,用于更新 JRE 中的时区数据。该工具可以从 IANA 时区数据库下载最新的时区信息并更新到 JRE 中。
 
 
notion image
下载后解压,使用Java运行jar
使用 java -jar tzupdater.jar -V 命令可以查看当前Java中的tz数据库版本和可升级的最新版本
使用 java -jar tzupdater.jar -l 命令可以升级当前环境的时区数据库版本
notion image
notion image
重新跑下格陵兰岛当前时间,可以看到时区偏移是正确的了。代码中获取时区数据库版本也为最新。
notion image
 
通过定期更新时区数据库,可以确保 Java 应用程序在全球范围内的时间处理都准确无误,从而提高应用程序的可靠性和用户满意度。
感谢阅读!如果文章内容有失误地方,请留言与我联系。
Jetcache 缓存的一些记录在 JMeter 中使用 BeanShell 断言
Loading...