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

时间:2019-02-25 22:58:20

标签: java datetime datetime-format timezone-offset java.time

这是错误还是功能?

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

  

四个字母输出完整的格式,即本地化的偏移文本,例如'GMT,具有2位数的小时和分钟字段,可选的第二字段(非零)和冒号(例如) “ GMT + 08:00”。

但是如果时间是格林尼治标准时间+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 :(得分:3)

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

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

在Java 8格式模式if (totalSecs != 0) {上,既不能单独解析OOOO,也不能解析GMT,这肯定是一个错误。它在Java 11中已修复。在Java 11 GMT+00:00上单独解析OOOO很好,因此他们必须认为这是可以接受的(尽管它也解析GMTGMT+00:00)。

您可以考虑向Oracle和/或OpenJDK提交错误(这些天我不确定合适的位置)。他们是否拒绝它,修复文档或修复代码-我不敢猜测。

解决方法:“ GMT” xxx

  

无论如何,我希望我的+00:00。

GMT-00:00
  

星期三2019.02.27 08:46:43.226 GMT + 00:00

答案 1 :(得分:0)

这不是错误。

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

  

本地化GMT格式:相对于GMT(或UTC)的常量,特定偏移量,可以是转换后的形式。有两种样式。第一个用于与格林尼治标准时间存在明显的非零偏移量的情况;此样式由element和element指定。长格式始终使用两位数的小时字段和分钟字段,以及可选的两位数的秒字段。简短格式用于最短的表示形式,并使用小时字段,且不带前导零,并带有可选的2位分钟和秒字段。此格式中用于小时,分钟和秒字段的数字是语言环境的默认十进制数字:

     

“ GMT + 03:30”(长)

     

“ GMT + 3:30”(简短)

     

“ UTC-03.00”(长)

     

“ UTC-3”(简短)

     

“Гриинуич+ 03:30”(长)

     

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

     

“格林尼治标准时间”

     

“ UTC”

     

“Гриинуич”

由于与GMT的偏移量为零,所以将应用底部子句,并且输出仅为“ GMT”(或任何与您的语言环境相对应的本地化文本)。

希望可以在将来的版本中阐明Javadoc。