我正在尝试解析:2014-05-02-10.45.05.993280-5:00其中-5:00是UTC的偏移量。 在Java 8中使用java.time DateTimeFormatter。
对于第一点,我具有以下内容:yyyy-MM-dd-HH.mm.ss.SSSSSS但是,我无法弄清楚解析偏移量的模式也应该是什么。
如果我的偏移量为4位数字(-05:00),则可以使用:yyyy-MM-dd-HH.mm.ss.SSSSSSxxx,但这对3位数字无效。
有任何想法吗?
使用大写字母X代替x,因此使用XXX。区别在于大X可以将输入字母" Z"识别为UTC-Offset +00:00,而小模式X则不能识别。
建议的模式:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
还请注意以下JDK错误:
java.time.format.DateTimeFormatter cannot parse an offset with single
digit hour
更新:
现在,我已经在错误日志中测试了所描述的解决方法。
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));
但这会引发异常:
Exception in thread"main" java.time.format.DateTimeParseException:
Text '2014-05-02-10.45.05.993280-5:00' could not be parsed at index 26
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at HelloWorld.main(HelloWorld.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-bug-status,该错误已针对Java-9进行了修复,但是Java-8的反向端口似乎不可用。
该模式不起作用...但是该错误的链接确实像我的问题。 我尝试了构建器的建议,但这似乎也不起作用。
@猎豹你是对的。 对不起,您受到该错误的困扰。 如果您可以使用任何其他替代方法,请另参阅我的更新。
SimpleDateFormat符号的偏移量是Z检查Java7或Java8 SimpleDateFormat API。
然后,您的String解析器格式
2014-05-02-10.45.05.993280-5:00
一定是:
yyyy-MM-dd-HH.mm.ss.SSSSSSZ
更新:对于DateTimeFormatter,用于格式化和解析的偏移量模式为:
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
DateTimeFormatter中所需的模式是X。
我正在使用DateTimeFormatter并添加Z不能正常工作
您两次链接到Java 7。 Java 8 API在这里。
我尝试了这种方法的变体,但无法在格林尼治标准时间将其打印为" +00:00"格式。 它只会打印" +0000"。 另一方面,如果时区至少偏移了1,则DateTimeFormatter.ISO_OFFSET_DATE_TIME将打印以前的所需模式。