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
答案 0 :(得分:3)
一个错误?我们似乎同意观察到的行为与文档不一致(或者至少您必须对文档进行非常有创意的阅读才能使其匹配)。
功能?据我所知,在某些时候,观察到的行为是一个有意识的决定。 implementation
内的私有内部类LocalizedOffsetIdPrinterParser
的源代码在打印小时,分钟和秒之前包含DateTimeFormatterBuilder
。它看起来不像是复制粘贴错误,因为文件中没有完全相同的代码行(偏移量0在很多地方都经过特殊处理,但我不知道其他地方完全被遗漏了)。
在Java 8格式模式if (totalSecs != 0) {
上,既不能单独解析OOOO
,也不能解析GMT
,这肯定是一个错误。它在Java 11中已修复。在Java 11 GMT+00:00
上单独解析OOOO
很好,因此他们必须认为这是可以接受的(尽管它也解析GMT
和GMT+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。