为什么`GMT + 8`无法用模式`O`解析,尽管直接从doc中复制?

Bas*_*que 10 java datetime java-time

为什么以下命令无法运行,日期时间字符串无法解析为OffsetDateTime

String inputOdt = "2016-01-23T12:34:56 GMT+8";
DateTimeFormatter formatterOdt = DateTimeFormatter.ofPattern ( "yyyy-MM-dd'T'HH:mm:ss O" );
OffsetDateTime odt = OffsetDateTime.parse ( inputOdt , formatterOdt );
Run Code Online (Sandbox Code Playgroud)

使用Java(TM) SE Runtime Environment (build 1.8.0_92-b14)Mac OS X上埃尔卡皮坦10.11.4.

生成错误:

线程"main"中的异常java.time.format.DateTimeParseException:无法解析文本'2016-01-23T12:34:56 GMT + 8':字符串索引超出范围:25

所述偏移从-UTCGMT+8从类文件在例如复制粘贴DateTimeFormatter.报价:

偏移O:根据模式字母的数量格式化本地化偏移.一个字母输出本地化偏移的缩写形式,即局部偏移文本,例如'GMT',小时不带前导零,可选2位数分钟,第二个非零,和冒号,例如'GMT + 8 ".


字符串的其余部分成功解析为LocalDateTime.所以问题似乎确实是从UTC部分偏移.

String inputLdt = "2016-01-23T12:34:56";
DateTimeFormatter formatterLdt = DateTimeFormatter.ofPattern ( "yyyy-MM-dd'T'HH:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse ( inputLdt , formatterLdt );

System.out.println ( "" );
System.out.println ( "inputLdt: " + inputLdt );
System.out.println ( "ldt: " + ldt );
Run Code Online (Sandbox Code Playgroud)

inputLdt:2016-01-23T12:34:56

ldt:2016-01-23T12:34:56


解决方法

部分解决方法是在输入字符串和格式设置模式中添加尾随SPACE.这样可行.

String input = "Sat May 02 2015 00:00:00 GMT+08 "; // Trailing space.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM dd yyyy HH:mm:ss O " ); // Trailing space.
OffsetDateTime odt = OffsetDateTime.parse ( input , formatter ); // SUCCEEDS
Run Code Online (Sandbox Code Playgroud)

但是在没有冒号的情况下添加分钟记录为使用单个O但是失败了.在这种情况下,尾随SPACE的这种解决方法没有帮助.请注意,GMT+0800在此示例中,与GMT+08上面直接看到的情况相反,此示例失败但上面的示例成功.

String input = "Sat May 02 2015 00:00:00 GMT+0800 "; // Minutes in the offset, and trailing space.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM dd yyyy HH:mm:ss O " ); // Trailing space.
OffsetDateTime odt = OffsetDateTime.parse ( input , formatter ); // FAILS
Run Code Online (Sandbox Code Playgroud)

And*_*eas 5

似乎是Java中的错误。参见https://bugs.openjdk.java.net/browse/JDK-8154050

java.time.format.DateTimeFormatter无法解析本地化的区域偏移

DateTimeFormatter无法为包含“ O”的格式字符串解析其自身的输出。以下代码在最后一行抛出StringIndexOutOfBoundsException。

import java.time.ZoneOffset
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("yyyy-MM-dd'T'HH:mm:ss.S O")
        .withLocale(Locale.ENGLISH)
String date = formatter.format(ZonedDateTime.now(ZoneOffset.UTC));
formatter.parse(date)
Run Code Online (Sandbox Code Playgroud)

发生的错误消息/堆栈跟踪: java.time.format.DateTimeParseException: Text '2016-04-08T10:49:52.7 GMT' could not be parsed: String index out of range: 25

并在评论中:

附加的测试用例执行于:
JDK 8-失败
JDK 8u77- 失败JDK 9EA-
失败

似乎它已在Java 9 build b116中修复。