Java – 无论JRE版本如何,都可以找到正在使用的tzdata版本

我们有一个简单的实用程序应用程序,它可以读取JRE中使用的所有时区数据,并将其全部显示在一个简单的表中。 我们需要使用较旧版本的JRE(6_24)来发布即将发布的产品(由于显然存在其他问题),但我们还需要在该版本中包含更新的时区更新(否则将包含在6_29中) )。 我们已经打包了一个将要安装的私有JRE,因此使用TZUpdater工具将时区更新到该私有JRE不是问题 – 问题是读取/validationtzdata的哪个版本(例如tzdata2010o,tzdata2011k)是正在使用实用程序应用程序读取(即正在运行应用程序的JRE中使用的版本)。 该应用程序当前在标题栏中显示JRE版本 ,但随着时区更新,这已不再足以确定正在使用的时区数据版本。

我查看了TimeZone类,但它似乎没有提供这些信息 – 也许有一个系统属性可以保存这些信息? TZUpdater工具知道正在使用哪个版本,所以它必须在某个地方可用 – 我无法想象他们会在分析中确定更新工具中正在使用哪个版本…有谁知道在哪里找到这个信息?

在Java 8中,您可以使用ZoneRulesProvider.getVersions("UTC")

版本的确切含义和格式是提供者特定的。 版本必须遵循词典顺序,因此返回的地图将从最早的已知规则到最新的可用规则进行排序。 默认的“TZDB”组使用的版本编号包括年份后跟一个字母,例如“2009e”或“2012f”。

例:

 System.out.println(java.time.zone.ZoneRulesProvider.getVersions("UTC").lastEntry().getKey()); 

在我的Oracle Java 8u91中,我得到:

2016a

这是一个在IBM和Oracle JRE中对我有用的hackish:

 public static void main(String args[]) throws Exception { File f = new File(System.getProperty("java.home") + File.separator + "lib" + File.separator + "zi" + File.separator + "ZoneInfoMappings"); if (f.exists()) { FileInputStream fis = new FileInputStream(f); byte[] buf = new byte[11]; try { fis.skip(11); fis.read(buf); System.out.print("Olson Database version is "); System.out.println(new String(buf)); } finally { fis.close(); } } } 

我的jdk1.6.0_29 jre说tzdata2012i,我的websphere7 JDK说tzdata2011g

您可以谷歌那些以查看您的JDK是否已更新,以及哪些区域具有tz更改。

在Windows中,使用

 findstr tzdata \lib\zi\ZoneInfoMappings 

以下参考和链接对于完全理解JRE中的tzdata非常有用。

http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html

要在其他平台中确定TZData,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/time-zone001.html