Java синхронизирует список часовых поясов с moment-timezone.js

Я реализую настройку, в которой пользователь выбирает часовой пояс из выпадающего списка, а затем мое приложение отображает текущее время в выбранном часовом поясе с помощью moment-timezone.js.

я использую TimeZone.getAvailableIDs() чтобы получить список часовых поясов со стороны сервера, чтобы создать раскрывающийся список. Однако moment-timezone.js не может проанализировать некоторые идентификаторы часовых поясов из списка. Я проверил размер списка и сравнил его с moment.tz.names() из момента-timezone.js, и обнаружил, что список из момента-timezone.js имеет примерно на 30 меньше идентификаторов, чем список из Java. Я подозреваю, что это может быть связано с версиями часовых поясов, но я не уверен, так как я использую Java 7 и версию, которую я нашел в ZoneInfoMappings это 2014b, в то время как файл данных для момента-timezone.js у меня есть 2016f.

Есть ли способ заставить и Java, и moment-timezone.js получать данные из одного и того же списка, чтобы я мог синхронизировать их? Я ограничен Java 7 и не могу использовать Time от Java 8, и я предпочитаю использовать нативные библиотеки Java, поэтому сейчас я не рассматриваю Joda Time.

2 ответа

Решение

Несколько вещей:

  • И Java, и Moment-Timezone используют одни и те же исходные данные, базу данных tz из IANA. Поскольку редакции этих данных публикуются несколько раз в год, вы должны быть в курсе последних изменений и использовать одну и ту же версию с обеих сторон.

  • Используйте утилиту TZUpdater для обновления данных о часовых поясах в Java.

  • Имейте в виду, что существует несколько дополнительных трехбуквенных идентификаторов, поддерживаемых Java для устаревших целей, которые не являются идентификаторами TZDB. Из JavaDoc на TimeZone:

    Трехбуквенные идентификаторы часовых поясов

    Для совместимости с JDK 1.1.x также поддерживаются некоторые другие трехбуквенные идентификаторы часовых поясов (такие как "PST", "CTT", "AST"). Однако их использование не рекомендуется, потому что одна и та же аббревиатура часто используется для нескольких часовых поясов (например, "CST" может быть "Центральное стандартное время США" и "Стандартное китайское время"), и тогда платформа Java может распознавать только одно из их.

    Здесь приведен более полный список, некоторые из которых являются псевдонимами TZDB, а некоторые существуют только в Java.

    Если вы хотите добавить устаревшие идентификаторы Java в часовой пояс, вы можете добавить их в виде ссылок, и тогда ваши списки будут выглядеть одинаково с обеих сторон. Например:

    moment.tz.link('Asia/Shanghai|CTT');
    

    Однако, вероятно, лучше всего было бы запретить использование нестандартных идентификаторов на стороне сервера.

Размер списка отличается, так как вы фактически сравниваете два списка, написанные с интервалом в два года.

Если вы хотите получить самый последний (2016g) список часовых поясов для Java/ даже для обновления того, что вы получаете в Javascript, вы можете получить их здесь https://www.iana.org/time-zones

Вы можете изменить URL-адреса, указанные на сайте для более старых версий (2016f), если вам это нужно.

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

Вы можете увидеть здесь: http://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html С любым из JDK 6/7/8. Вы будете ограничены версией 2016d.

Другие вопросы по тегам