首页 > 解决方案 > 为什么时区模式“OOOO”不显示完整的 GMT+00:00 偏移格式?

问题描述

这是错误还是功能?

DateTimeFormatterJavaDoc明确指出,当我在格式化程序中使用该模式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

标签: javadatetimedatetime-formattimezone-offsetjava-time

解决方案


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

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

在 Java 8 格式模式上,OOOO既不单独解析GMT也不单独解析GMT+00:00,这一定是一个错误。它在 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 年 2 月 27 日星期三 08:46:43.226 GMT+00:00


推荐阅读