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

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

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

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


person lukforce    schedule 10.10.2016    source источник
comment
Привет @lukforce, чтобы улучшить свой вопрос, вы должны опубликовать код, который вы пробовали, так как это приведет к лучшим ответам.   -  person David    schedule 10.10.2016


Ответы (2)


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

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

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

  • #P4#
    #P5# #P6#
    #P7# #P8#
    moment.tz.link('Asia/Shanghai|CTT');
    
    #P9#
person Matt Johnson-Pint    schedule 13.10.2016
comment
Да, я заметил, что в данный момент не хватает трех букв, как вы упомянули. Не разрешая их, вы имеете в виду, что единственный способ - удалить их на стороне сервера Java, чтобы оба списка совпадали? - person lukforce; 13.10.2016
comment
Звучит правильно. Я бы взял список, возвращенный getAvailableIDs, и отфильтровал его. - person Matt Johnson-Pint; 14.10.2016
comment
Это то, что я сделал на данный момент, но я все еще надеялся на решение, в котором я могу просто иметь два совпадающих списка без необходимости делать это. Многократное удаление записей из этого умеренно длинного списка выглядит не очень хорошо с точки зрения производительности. - person lukforce; 14.10.2016

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

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

person UserF40    schedule 10.10.2016
comment
Как мне загрузить более новую версию данных tz в мое приложение? Использую ли я tzupdater для Java, который использую для компиляции, или обновляю его для своего сервера приложений (в данном случае WebLogic)? - person lukforce; 11.10.2016
comment
Я использовал tzupdater для обновления списка Java (как на компиляторе, так и на сервере приложений), теперь список даже больше, чем раньше (было 620, теперь 629), а список моментов 588. Я проверил версию и она соответствует 2016f версия, которую я нашел в моем файле данных о часовом поясе момента. Есть ли другой способ синхронизировать списки? - person lukforce; 11.10.2016