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

#java #timezone #momentjs #iana

#java #Часовой пояс #momentjs #iana

Вопрос:

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

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

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

Комментарии:

1. Привет @lukforce, чтобы улучшить свой вопрос, вы должны опубликовать код, который вы пробовали, поскольку это приведет к лучшим ответам.

Ответ №1:

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

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

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

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

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

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

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

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

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

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

Комментарии:

1. Да, я заметил, что в moment отсутствуют 3 буквы, как вы упомянули. Не разрешая их, вы имеете в виду, что единственный способ — удалить их на стороне сервера Java, чтобы оба списка совпадали?

2. Звучит правильно. Я бы взял список, возвращенный из getAvailableIDs , и отфильтровал его.

3. Это то, что я сделал на данный момент, но я все еще надеялся на решение, в котором я могу просто иметь два совпадающих списка, не делая этого. Многократное удаление записей из этого умеренно длинного списка выглядит не так хорошо с точки зрения производительности.

Ответ №2:

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

Если вы хотите получить самый последний (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.

Комментарии:

1. Как мне загрузить более новую версию данных tz в мое приложение? Использую ли я tzupdater на Java, которую я использую для компиляции, или я обновляю его для своего сервера приложений (в данном случае WebLogic)?

2. Я использовал tzupdater для обновления списка Java (как на компиляторе, так и на сервере приложений), теперь список еще больше, чем раньше (было 620, теперь 629), а список moment равен 588. Я проверил версию, и она соответствует версии 2016f, которую я нашел в своем файле данных текущего часового пояса. Есть ли другой способ синхронизировать списки?