2011-10-31 9 views
6

Mamy prostą aplikację użytkową, która odczytuje wszystkie dane strefy czasowej używane w środowisku JRE i wyświetla je wszystkie w prostej tabeli. Musimy użyć starszej wersji JRE (6_24) do wydania nadchodzącej wersji produktu (z powodu innych problemów), ale w tym wydaniu musimy również wprowadzić nowsze aktualizacje strefy czasowej (które w przeciwnym razie byłyby uwzględnione np. W 6_29).). Już pakujemy prywatne środowisko JRE, które zostanie zainstalowane, więc uzyskanie aktualizacji strefy czasowej do tego prywatnego środowiska JRE przy użyciu TZUpdater tool nie jest problemem - problem polega na czytaniu/sprawdzaniu, która wersja tzdata (np. Tzdata2010o, tzdata2011k) jest odczytać za pomocą aplikacji narzędziowej (tj. która wersja jest używana w środowisku JRE, w którym działa aplikacja). Aplikacja wyświetla obecnie na pasku tytułowym wersję JRE, ale z aktualizacjami strefy czasowej nie jest już wystarczająca do określenia, która wersja 2 strefy czasowej jest używana.Java - znajdź używaną wersję tzdata niezależnie od wersji JRE

Zajrzałem do klasy TimeZone, ale nie wydaje się, aby podać te informacje - być może istnieje właściwość systemu, która przechowuje te informacje? Narzędzie TZUpdater wie, która wersja jest używana, więc musi być gdzieś dostępne - nie wyobrażam sobie, żeby analitycznie ustalili, która wersja jest używana w narzędziu do aktualizacji ... Czy ktoś wie, gdzie zlokalizować te informacje?

Odpowiedz

8

W jednym z moich JRE znajduje się plik o numerze JRE_PATH\lib\zi o nazwie ZoneInfoMappings. W pierwszym wierszu wyświetla dane, których szukasz.

Zamierzam poszukać mniej hackish sposób, zaktualizuje odpowiedź, jeśli coś znajdę.

AKTUALIZACJA: Wygląda na to, że nie ma interfejsu API do pobierania tych danych. Jednak kod w klasie sun.util.calendar.ZoneInfoFile pokazuje, jak go przeanalizować.

+0

Tak, to folder, który zostanie zastąpiony przez TZUpdater, a ja zauważyłem (po zaksięgowaniu pytanie) że ZoneInfoMappings zawiera tę linię, ale Notepad ++ pokazuje inne dane/znaki dookoła niego w pierwszej linii, co sprawiło, że myślę, że będzie to wymagało jakichś hackowskich rzeczy ... Miejmy nadzieję, że jest lepszy sposób na uzyskanie tego z JRE lub ktoś może opublikować kod aby odczytać ten plik/linię ... – johnny

+0

Zaktualizowana odpowiedź. –

+0

kod używany tutaj jako przykład do analizy tego: http://www.docjar.com/html/api/sun/util/calendar/ZoneInfoFile.java.html – johnny

1

Oto hackish rzeczą, że pracował dla mnie w obu JRE IBM i Oracle:

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(); 
     } 
    }  
} 

Moja jdk1.6.0_29 jre mówi tzdata2012i, a mój websphere7 JDK mówi tzdata2011g

Można google tych, Sprawdź, czy Twój JDK jest aktualizowany i które strefy mają to, co zmienia tz.

1

W Javie 8, można użyć ZoneRulesProvider.getVersions("UTC"):

Dokładne znaczenie i format wersji jest specyficzny dostawcą. Wersja musi być zgodna z porządkiem leksykograficznym, dlatego zwrócona mapa zostanie uporządkowana od najstarszych znanych reguł do najnowszych dostępnych reguł. Domyślna grupa "TZDB" używa numerowania wersji składającego się z roku, po którym następuje litera, na przykład "2009e" lub "2012f".

Przykład:

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

W moim Oracle Java 8u91, otrzymuję:

2016a

Powiązane problemy