Java 使用时区偏移值分析ZoneDateTime字符串

Java 使用时区偏移值分析ZoneDateTime字符串,java,date,parsing,iso8601,zoneddatetime,Java,Date,Parsing,Iso8601,Zoneddatetime,我正在尝试使用下面的ZonedDateTime对象行解析格式为“yyyy-MM-dd'T'HH:MM:ssZ”的ISO8601时间字符串: ZonedDateTime date = ZonedDateTime.parse("2021-02-19T14:32:12+0000", DateTimeFormatter.ISO_ZONED_DATE_TIME); 但是,在执行此操作时,我遇到以下错误: java.time.format.DateTimeParseException:

我正在尝试使用下面的ZonedDateTime对象行解析格式为“yyyy-MM-dd'T'HH:MM:ssZ”的ISO8601时间字符串:

ZonedDateTime date = ZonedDateTime.parse("2021-02-19T14:32:12+0000", DateTimeFormatter.ISO_ZONED_DATE_TIME);
但是,在执行此操作时,我遇到以下错误:

java.time.format.DateTimeParseException: Text '2021-02-19T14:32:12+0000' could not be parsed at index 19

我无法想象这是不允许的,因为+符号是解析的有效字符。有人能帮忙解释一下这里的错误吗?

这是因为
ISO\u ZONED\u DATE\u TIME
需要一个偏移量和一个分区。请参见编辑,并非所有情况下都需要编辑。这是因为偏移量必须包含冒号

使用模式的DateTimeFormatter.of(“uuuu-MM-dd'T'HH:MM:ssxx”,Locale.ROOT)。或者,您可以使用
DateTimeFormatterBuilder

new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_DATE_TIME)
.附录模式(“xx”)
.toFormatter(Locale.ROOT);
编辑
仅仅读取Javadoc的摘要片段显然是不够的。如注释中所述,ISO分区日期时间不严格要求分区id。第二个要点提到它:“如果区域ID不可用或是区域偏移,那么格式就完整了。”

这是因为
ISO_ZONED_DATE_TIME
需要偏移和区域。请参见编辑,并非所有情况下都需要编辑。这是因为偏移量必须包含冒号

使用模式的DateTimeFormatter.of(“uuuu-MM-dd'T'HH:MM:ssxx”,Locale.ROOT)。或者,您可以使用
DateTimeFormatterBuilder

new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_DATE_TIME)
.附录模式(“xx”)
.toFormatter(Locale.ROOT);
编辑
仅仅读取Javadoc的摘要片段显然是不够的。如注释中所述,ISO分区日期时间不严格要求分区id。第二个要点提到了它:“如果区域ID不可用或是区域偏移,那么格式就完整了。”

谢谢,这种方法很有效,我选择使用旧的格式语法,因为偏移需要有4位数字,而不是两位数字。DateTimeFormatter.ofPattern(“yyyyy-MM-dd'T'HH:MM:ssZ”,Locale.ROOT)
ISO_-ZONED_-DATE_-TIME
在没有区域ID的情况下生活得很愉快。您链接到的文档说明,如果区域ID不可用……那么在区域偏移之后,格式就完成了。真正的问题是偏移量中缺少冒号。您认为格式模式字符串中的
xx
解决了这个问题(无论是否使用生成器)。谢谢您,这种方法很有效,我选择使用较旧的格式语法,因为偏移量需要有4位数字,而不是两位数字。DateTimeFormatter.ofPattern(“yyyyy-MM-dd'T'HH:MM:ssZ”,Locale.ROOT)
ISO_-ZONED_-DATE_-TIME
在没有区域ID的情况下生活得很愉快。您链接到的文档说明,如果区域ID不可用……那么在区域偏移之后,格式就完成了。真正的问题是偏移量中缺少冒号。格式模式字符串中的
xx
解决了它(无论是否使用生成器),这是正确的。可能会有帮助吗?或者这个问题。可能会有帮助吗?或者这个问题。