Почему шаблон часового пояса "OOOO" не показывает полный формат смещения GMT + 00: 00? - PullRequest
0 голосов
/ 26 февраля 2019

Это ошибка или функция?

DateTimeFormatter JavaDoc явно заявляет, что когда я использую шаблон OOOO в моем форматере, полная форма *Следует использовать 1008 * локализованного часового пояса (выделено мое):

Четыре буквы выводят полную форму, которая представляет собой локализованный текст смещения, такой как 'GMT, с 2-значными часами и минутамиполе , необязательное второе поле, если оно не равно нулю, и двоеточие, например 'GMT + 08: 00'.

Но в случае, когда время в GMT + 0:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE yyyy.MM.dd HH:mm:ss.SSS OOOO");

String timestamp = OffsetDateTime.ofInstant(Instant.now(), ZoneOffset.UTC).format(formatter);
System.out.println(timestamp);

Это вывод:

Mon 2019.02.25 22:30:00.586 GMT

Ожидаемый:

Mon 2019.02.25 22:30:00.586 GMT+00:00

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Это не ошибка.

Спецификация Java соответствует LDML (CLDR).См. здесь для определения «OOOO» и здесь для определения «локализованного формата GMT»:

Локализованный формат GMT: постоянный, специфичныйсмещение от GMT (или UTC), которое может быть в переводе.Для этого есть два стиля.Первый используется, когда есть явное ненулевое смещение от GMT;этот стиль определяется элементом и элементом.В длинном формате всегда используются двухзначное поле часов и поле минут, а также необязательное двухзначное поле секундСокращенный формат предназначен для кратчайшего представления и использует часовые поля без начального нуля с необязательными двухзначными полями минут и секунд.Цифры, используемые для полей часов, минут и секунд в этом формате, являются десятичными цифрами по умолчанию для локали:

"GMT + 03: 30" (long)

"GMT + 3: 30" (короткий)

"UTC-03.00" (длинный)

"UTC-3" (короткий)

"Гриинуич + 03: 30" (длинный)

В противном случае (когда смещение по Гринвичу равно нулю, что относится к самому Гринвичу) используется стиль, указанный элементом:

"GMT"

"UTC"

"Гриинуич"

Поскольку смещение по Гринвичу равно нулю, применяется нижнее предложение, а выводом является просто "GMT" (или любой другой правильный текст для вашей локали).

Надеюсь, Javadoc можно будет уточнить в следующем выпуске.

0 голосов
/ 27 февраля 2019

ошибка?Похоже, мы согласны с тем, что наблюдаемое поведение не согласуется с документацией (или, по крайней мере, вам потребуется очень творческое прочтение документации, чтобы привести ее в соответствие).

Функция?Насколько я могу судить, наблюдаемое поведение в какой-то момент является сознательным решением.Исходный код для закрытого внутреннего класса LocalizedOffsetIdPrinterParser внутри DateTimeFormatterBuilder содержит if (totalSecs != 0) { до печати часов, минут и секунд.Это не похоже на ошибку копирования-вставки, поскольку точно такая же строка кода больше нигде в файле (смещение 0 специально обрабатывается во многих местах, но я не знаю нигде, где оно полностью исключено).

В шаблоне формата Java 8 OOOO не анализирует GMT в одиночку или GMT+00:00, что должно быть ошибкой.Это исправлено в Java 11. В Java 11 OOOO синтаксический анализ GMT в одиночку очень хорош, поэтому они, должно быть, сочли это приемлемым (хотя он также анализирует GMT+00:00 и GMT-00:00).

Вы можетерассмотрите возможность сообщения об ошибке в Oracle и / или OpenJDK (я не уверен насчет правильного места в эти дни).Будут ли они отклонены, исправят документацию или исправят код - я не смею пытаться угадать.

Обходной путь: 'GMT'xxx

В любом случае,Я хочу как-то +00: 00.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE yyyy.MM.dd HH:mm:ss.SSS 'GMT'xxx");

Ср 2019.02.27 08: 46: 43.226 GMT + 00: 00

...