Java - найти версию tzdata независимо от версии JRE - PullRequest
7 голосов
/ 31 октября 2011

У нас есть простое служебное приложение, которое считывает все данные о часовых поясах, используемых в JRE, и отображает все это в простой таблице.Нам нужно использовать более старую версию JRE (6_24) для предстоящего выпуска продукта (очевидно, из-за других проблем), но мы также должны включить более новые обновления часовых поясов в этот выпуск (которые в противном случае были бы включены, скажем, в 6_29).).Мы уже упаковываем частную JRE, которая будет установлена, поэтому получение обновлений часового пояса в эту частную JRE с помощью инструмента TZUpdater не является проблемой - проблема заключается в чтении / проверке, какая версия tzdata (например, tzdata2010o, tzdata2011k) читается с помощью служебного приложения (т. е. какая версия используется в JRE, в которой выполняется приложение).В настоящее время приложение отображает версию JRE в строке заголовка, но с обновлениями часового пояса уже недостаточно для определения, какая информация о часовом поясе версия используется.

Я изучил класс TimeZone , но, похоже, он не предоставляет эту информацию - возможно, есть системное свойство, которое содержит эту информацию?Инструмент TZUpdater знает, какая версия используется, поэтому она должна быть где-то доступна - я не могу себе представить, чтобы они аналитически определяли, какая версия используется в инструменте обновления ... Кто-нибудь знает, где найти эту информацию?

Ответы [ 4 ]

8 голосов
/ 31 октября 2011

В одной из моих JRE есть файл в JRE_PATH\lib\zi с именем ZoneInfoMappings.В первой строке отображаются данные, которые вы ищете.

Я собираюсь найти менее хакерский способ, обновлю ответ, если найду что-нибудь.

ОБНОВЛЕНИЕ: Кажется, что естьнет API для получения этих данных.Однако код в классе sun.util.calendar.ZoneInfoFile показывает, как его анализировать.

4 голосов
/ 21 января 2017

В Java 8 вы можете использовать ZoneRulesProvider.getVersions("UTC"):

Точное значение и формат версии зависят от поставщика.Версия должна соответствовать лексикографическому порядку, поэтому возвращаемая карта будет иметь порядок от самых старых известных правил до самых новых доступных правил.Группа по умолчанию «TZDB» использует нумерацию версий, состоящую из года, за которым следует буква, например «2009e» или «2012f».

Пример:

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

В моемOracle Java 8u91, я получаю:

2016a

1 голос
/ 15 февраля 2013

Вот хакерская вещь, которая работала для меня как в JRE IBM, так и в 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();
        }
    }       
}

Мой jdk1.6.0_29 jre говорит tzdata2012i, а мой websphere7 JDK говорит tzdata2011g

Вы можетеGoogle, чтобы увидеть, обновлен ли ваш JDK, и какие зоны имеют изменения.

0 голосов
/ 23 мая 2017

В окнах используйте

findstr tzdata <java-home>\lib\zi\ZoneInfoMappings

Следующая ссылка и ссылка были полезны для полного понимания tzdata в JRE.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...