Форматер VS Несоответствия DateFormat

посылка

Этот вопрос может считаться слишком широким или основанным на мнении, но я чувствую, что все равно должен рисковать.

проблема

Существует ряд непонятных несоответствий между форматами преобразования даты и времени, проиллюстрированными в API Formatter VS SimpleDateFormat Java.

Например:

  • M представляет минуту в Formatter но месяц в SimpleDateFormat и наоборот
  • S а также L соответственно представляют вторую и миллисекунду в Formatter, но s а также S соответственно представляют вторую и миллисекунду в SimpleDateFormat
  • A а также a соответственно представляют длинное / короткое название дня в неделе в Formatter но тот же вывод в SimpleDateFormat представлен <= 2 против > 2 последовательные вхождения E, в то время как a вместо этого представляет маркер AM/PM SimpleDateFormat
  • И т.п.

Вопрос(ы)

  • Есть ли некоторая рационализация, оправдывающая эти несоответствия, например, может быть, два класса используют разные стандарты?
  • Я могу только сделать вывод из FormatterAPI, который:

    Типы похожи, но не полностью идентичны тем, которые определены в GNU date и POSIX strftime(3c),

  • SimpleDateFormat похоже, даже не упоминает обоснование своих конвенций
  • Являются ли эти два соглашения произвольными и противоречивыми по своему замыслу или существуют неявные стандарты, о которых я не знаю, которые оправдывают эти несоответствия?

1 ответ

Решение

SimpleDateFormat

Как сказал @Tunaki, SimpleDateFormat используются символы шаблона, определенные в таблице символов поля даты (которая стандартизирована CLDR или репозиторием данных Unicode Common Locale).

Этот проект широко используется многими компаниями, такими как Google, IBM, Microsoft, Apple и т. Д., Для создания обширного стандартного хранилища данных локали, а также для интернационализации и локализации программного обеспечения. Вот почему некоторые шаблоны даты / времени очень похожи на другие из разных языков программирования.

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

Чтобы понять это, мы должны указать, что означает процесс "разбора":

  • Отображение между моментом времени (UDate) и набором полей календаря, которое, в свою очередь, зависит от:
    • Правила конкретной календарной системы (например, григорианский, буддийский, китайский лунный)
    • Часовой пояс
  • Сопоставление между набором полей календаря и форматированным текстовым представлением, которое зависит от полей, выбранных для отображения, их стиля отображения и соглашений конкретной локали.

Итак, необходимо знать, что скелет "MMMMdjmm" может привести к следующим шаблонам формата для разных локалей:

Locale | format pattern
------ | ---------------------
en_US  | "MMMM d 'at' h:mm a"
es_ES  | "d 'de' MMMM, H:mm"  
ja_JP  | "M月d日 H:mm"

Formatter

Причина по которой Formatter "приняты" различные шаблоны форматирования, потому что этот класс должен интерпретировать строки формата в стиле printf, что очень близко к дате GNU и POSIX strftime(3c) реалии (как говорится в официальных документах).

Из документов GNU:

Выход из date Команда не всегда приемлема в качестве строки даты, не только из-за языковой проблемы, но и потому, что не существует стандартного значения для элементов часового пояса, таких как "IST".

При использовании даты для создания строки даты, предназначенной для последующего анализа, укажите формат даты, который не зависит от языка и не использует элементы часового пояса, кроме "UTC" и "Z".

Давайте посмотрим на простой пример даты / времени с GNU:

TZ=UTC0 date +'%Y-%m-%d %H:%M:%SZ'
// Output: 2004-03-01 00:21:42Z

Обратите внимание на стиль printf, а также на использование одинаковых символов преобразования Formatter учебный класс.

Тем не менее, документы также говорят, что они просто похожи, а не идентичны. Это потому, что Java выбрала некоторую гибкость для определенных полей, как в 'z' дело:

Числовое смещение часового пояса в стиле RFC 822 от GMT, например, -0800. Это значение будет корректироваться по мере необходимости для перехода на летнее время.

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