2011-10-31 49 views
6

我們有一個簡單的實用程序應用程序,它讀取JRE中使用的所有時區數據,並將其顯示在一張簡單的表格中。我們需要爲即將發佈的產品版本使用較舊版本的JRE(6_24)(由於顯然存在其他問題),但我們還需要在該版本中包含更新的時區更新(否則將包含在比如6_29 )。我們已經打包了將要安裝的私有JRE,因此使用TZUpdater tool將時區更新到該私有JRE中並不是問題 - 問題在於讀取/驗證哪個版本的tzdata(例如tzdata2010o,tzdata2011k)是使用實用程序應用程序閱讀(即在應用程序運行的JRE中使用哪個版本)。該應用程序當前在標題欄中顯示JRE版本,但是帶有時區更新,這不足以確定哪些版本的時區數據正在使用中。Java - 找到正在使用的tzdata版本,與JRE版本無關

我查看了TimeZone類,但它似乎沒有提供此信息 - 也許有一個系統屬性擁有此信息? TZUpdater工具知道正在使用哪個版本,所以它必須在某處可用 - 我無法想象他們會分析確定在更新工具中使用哪個版本...任何人都知道在哪裏找到這些信息?

回答

8

在我的一個JRE中,有一個名爲ZoneInfoMappings的文件JRE_PATH\lib\zi。在第一行中,它顯示您正在查找的數據。

我打算尋找一種不太冒犯的方式,如果我找到了某些東西,我會更新答案。

更新: 似乎沒有API來獲取此數據。然而,類sun.util.calendar.ZoneInfoFile中的代碼顯示瞭如何解析它。

+0

是啊,這是得到由TZUpdater替換的文件夾,我沒有通知(發佈問題後),其ZoneInfoMappings包含線,但Notepad ++在第一行顯示了一些其他的數據/字符,這讓我認爲這需要一些駭人的東西來實現它...所以希望有更好的方式從JRE獲得它或者有人可以發佈代碼閱讀該文件/行... – johnny

+0

已更新的答案。 –

+0

在此處使用代碼作爲示例來解析此問題:http://www.docjar.com/html/api/sun/util/calendar/ZoneInfoFile.java.html – johnny

1

下面是在IBM和甲骨文的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

可以在Google那些查看您的JDK是否已更新,以及哪些區域具有更改的內容。

1

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

的確切含義和版本格式是特定供應商。版本必須遵循字典順序,因此返回的地圖將按照最舊的已知規則到最新可用規則進行排序。默認的'TZDB'組使用版本編號,包括年份後跟一個字母,如'2009e'或'2012f'。

例子:

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

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

2016a