Форматер 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/PMSimpleDateFormat
- И т.п.
Вопрос(ы)
- Есть ли некоторая рационализация, оправдывающая эти несоответствия, например, может быть, два класса используют разные стандарты?
- Я могу только сделать вывод из
Formatter
API, который:Типы похожи, но не полностью идентичны тем, которые определены в 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. Это значение будет корректироваться по мере необходимости для перехода на летнее время.