使用大写字母X而不是x,因此XXX。不同之处在于,大X可以将输入字母“Z”识别为UTC-Offset +00:00,而小字母X不能。
建议图案:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
请也意识到以下JDK-bug的:
java.time.format.DateTimeFormatter无法解析单 位数小时的偏移
更新:
我现在已经在错误日志中测试了描述的解决方法。
String input = "2014-05-02-10.45.05.993280-5:00";
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter();
System.out.println(f.parse(input, ZonedDateTime::from));
但它抛出一个异常:线程 “main” java.time.format.DateTimeParseException
例外: 文本“2014-05-02-10.45.05.993280-5: 00'无法在索引26 上的java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 位于HelloWorld.main处的java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) (你好,世界。java:16)
因此,从宽松的解析也没有帮助。 所以现在只有三个选项留给你:
使用。解决方法由臭虫记者建议:[...]解决方法是单独解析日期/时间,使用手工编码解析器偏移并将LocalDateTime与手解析的偏移量相结合。不是一件容易的工作。
试试你自己的专门的字符串预处理。如果你有一个固定的格式,那么你可以尝试在位置26插入零数字(如果总输入长度是一个数字太小)。
或者你使用一个外部库,它可以做到这一点。我的库Time4J(v4.0)可以做到这一点,如果你愿意添加额外的依赖。看到这个代码:
String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();
更新:根据JDK-错误状态,该错误已修复了Java的9,但对于Java的8一个补丁包,似乎并没有被尽管如此。
您正在使用哪个版本的Java? –
@JonSkeet - 对不起,更新了原文。 – Cheetah