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
所述偏移从-UTC串GMT+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)
似乎是Java中的错误。参见https://bugs.openjdk.java.net/browse/JDK-8154050:
java.time.format.DateTimeFormatter无法解析本地化的区域偏移
DateTimeFormatter无法为包含“ O”的格式字符串解析其自身的输出。以下代码在最后一行抛出StringIndexOutOfBoundsException。
Run Code Online (Sandbox Code Playgroud)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)发生的错误消息/堆栈跟踪:
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中修复。