ICU4j SimpleDateFormatter возвращает нечетные результаты

Нашему проекту нужна квартальная поддержка, и, к сожалению, мы находимся на java 1.7 и застряли на ней по другим неудачным причинам.

Мы добавили библиотеку ICU4j для использования предоставленного SimpleDateFormat.

К сожалению, он очень странно анализирует даты (см. Ниже). Любая помощь будет оценена по достоинству.

  val formatter  = new java.text.SimpleDateFormat("yyyy")
  val formatter2 = new com.ibm.icu.text.SimpleDateFormat("yyyy")
  Array(formatter2.parse("1234"), formatter.parse("1234"))

Результат

0 = {Date@10561} "Sun Jan 01 00:00:00 PST 1234"
1 = {Date@10563} "Sun Jan 01 00:12:28 PST 1234"

Я много читал документы, но не уверен, почему он анализируется со смещением. Я уверен, что это часть API, и надеюсь, что кто-то сможет объяснить мои трудности. Любая помощь будет оценена по достоинству.

http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/SimpleDateFormat.html


person chapmatic    schedule 27.01.2017    source источник


Ответы (1)


О проблеме с часовым поясом:

Возможно, это данные/правила часового пояса ICU4J и ваш Java-7-JVM различаются для 1234 года. Обычно вы должны использовать годы после 1900, верно? Если это так, то вероятность получить те же правила намного выше. Если нет, то вам действительно следует позаботиться о выборе правильных версий, чтобы убедиться, что у вас одинаковые правила. Возможно, вам также потребуется применить инструмент tzupdater. из Оракула.

Обновление зон:

Благодаря хорошему исследованию OP мы можем установить системное свойство для ICU4J: com.ibm.icu.util.TimeZone.DefaultTimeZoneType = JDK

В любом случае, если единственной причиной использования ICU4J является поддержка на квартальные годы, то альтернативой также может быть

либо

используя мою библиотеку Time4J (строка v3.x, работающая на Java-6+7). Он также предлагает четверть поддержки за счет меньшего размера и лучшего API (ближе к тому, что делает java.time в Java-8), включая хорошую интернационализацию на основе тех же CLDR-данных, что и ICU4J, см. также документ шаблона

or

используя Threeten-Backport (с недостатком, заключающимся в отсутствии какой-либо интернационализации -> отсутствие локализованных данных).

person Meno Hochschild    schedule 27.01.2017
comment
Вы были правы! Спасибо за помощь. Я обнаружил, что вы можете установить свойство com.ibm.icu.util.TimeZone.DefaultTimeZoneType = JDK, которое решило все мои проблемы. Спасибо за предложения и библиотеки. Они оказались действительно полезными. - person chapmatic; 29.01.2017
comment
@chapmatic Интересно услышать об этом особом системном свойстве ICU4J. Узнали что-то новое. - person Meno Hochschild; 29.01.2017