java - 为什么时区模式“OOOO”不显示完整的 GMT+00:00 偏移格式?
问题描述
这是错误还是功能?
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
解决方案
一个错误?我们似乎同意观察到的行为与文档不一致(或者至少您必须对文档进行非常有创意的阅读以使其匹配)。
一个特征?据我所知,观察到的行为在某个时候是有意识的决定。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 年 2 月 27 日星期三 08:46:43.226 GMT+00:00
推荐阅读
- statistics - 计算相对误差:哪个值是参考值?
- php - 如何在 Laravel Excel 3.0 中注册工作表(注册)事件
- optimization - 清零非规范化 - 它可靠吗?
- actions-on-google - Google Home 上关于 Actions on Google 的提醒
- c++ - C++ 初始化何时仅使用复制构造函数,何时同时使用复制构造函数和赋值运算符
- html - Spring - 无法在 HTML 中显示来自 DB 的记录
- php - CakePHP 的深度联想之和
- php - php max_input_time -1 含义:php.ini vs php 文档?
- python - python中的斐波那契无法运行接收语法错误或其他的代码
- soapheader - tcp/ip 监视器中未显示肥皂标头