Почему шаблон часового пояса "OOOO" не показывает полный формат смещения GMT+00:00?
Это ошибка или особенность?
DateTimeFormatter
JavaDoc прямо заявляет, что когда я использую OOOO
В моем шаблоне должна использоваться полная форма локализованного часового пояса (выделено мое):
Четыре буквы выводят полную форму, которая представляет собой локализованный текст смещения, такой как "GMT", с двухзначным полем часа и минуты, необязательное второе поле, если оно не равно нулю, и двоеточие, например "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
1 ответ
Жук? Похоже, мы согласны с тем, что наблюдаемое поведение не согласуется с документацией (или, по крайней мере, вам придется очень креативно читать документацию, чтобы она соответствовала).
Особенность? Насколько я могу судить, наблюдаемое поведение в какой-то момент является сознательным решением. Исходный код для закрытого внутреннего класса 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
This is not a bug.
The Java specification follows LDML (CLDR). See here for the definition of "OOOO" and here for the definition of "localized GMT format":
Localized GMT format: A constant, specific offset from GMT (or UTC), which may be in a translated form. There are two styles for this. The first is used when there is an explicit non-zero offset from GMT; this style is specified by the element and element. The long format always uses 2-digit hours field and minutes field, with optional 2-digit seconds field. The short format is intended for the shortest representation and uses hour fields without leading zero, with optional 2-digit minutes and seconds fields. The digits used for hours, minutes and seconds fields in this format are the locale's default decimal digits:
"GMT+03:30" (long)
"GMT+3:30" (short)
"UTC-03.00" (long)
"UTC-3" (short)
"Гриинуич+03:30" (long)
Otherwise (when the offset from GMT is zero, referring to GMT itself) the style specified by the element is used:
"GMT"
"UTC"
"Гриинуич"
Since the offset from GMT is zero, the bottom clause applies, and the output is just "GMT" (or whatever is the correct localized text for your locale).
Hopefully the Javadoc can be clarified in a future release.