为什么时区模式“OOOO”没有显示完整的GMT + 00:00偏移格式?

问题描述 投票:5回答:2

这是一个错误还是一个功能?

DateTimeFormatter JavaDoc明确指出,当我在格式化程序中使用OOOO模式时,应使用完整形式的本地化时区(强调我的):

四个字母输出完整形式,这是本地化的偏移文本,例如'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
java datetime datetime-format timezone-offset java.time
2个回答
3
投票

一个bug?我们似乎同意观察到的行为与文档不一致(或者至少您必须对文档进行非常有创意的阅读以使其匹配)。

一项功能?据我所知,观察到的行为在某个时刻是有意识的决定。 LocalizedOffsetIdPrinterParser中私有内部类DateTimeFormatterBuilder的源代码在打印小时,分钟和秒之前包含if (totalSecs != 0) {。它看起来不像复制粘贴错误,因为完全相同的代码行在文件中没有其他地方(偏移0在许多地方被特别处理,但我不知道其他地方完全被遗漏)。

在Java 8格式模式OOOO既不单独解析GMT也不解析GMT+00:00,这必须是一个bug。它已在Java 11中修复。在Java 11上,OOOO单独解析GMT就好了,所以他们一定认为这是可以接受的(尽管它解析了GMT+00:00GMT-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


0
投票

这不是一个错误。

Java规范遵循LDML(CLDR)。有关“OOOO”的定义,请参阅here;有关“本地化GMT格式”的定义,请参阅here

本地化GMT格式:GMT(或UTC)的常量特定偏移量,可以是翻译形式。这有两种风格。当GMT存在明显的非零偏移时,使用第一个;此样式由元素和元素指定。长格式始终使用2位小时字段和分钟字段,可选的2位秒字段。短格式用于最短表示,并使用不带前导零的小时字段,可选的2位分钟和秒字段。用于此格式的小时,分​​钟和秒字段的数字是区域设置的默认小数位数:

“GMT + 03:30”(长)

“GMT + 3:30”(简称)

“UTC-03.00”(长)

“UTC-3”(短)

格林威治+ 03:30(长)

否则(当GMT的偏移量为零时,参考GMT本身),使用元素指定的样式:

“格林威治标准时间”

“世界标准时间”

“Griinuich”

由于GMT的偏移量为零,因此底部子句适用,输出只是“GMT”(或者您的语言环境的正确本地化文本)。

希望Javadoc可以在将来的版本中得到澄清。

© www.soinside.com 2019 - 2024. All rights reserved.