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.