You use https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html这个默认格式化程序:ISO_OFFSET_DATE_TIME https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_OFFSET_DATE_TIME(因为解析2015-08-18T00:00+01:00
).
在文档中:
这将返回一个不可变的格式化程序,能够格式化和解析 ISO-8601 扩展偏移日期时间格式。 [...]
偏移量 ID。如果偏移量有秒,那么即使这不是 ISO-8601 标准的一部分,它们也会被处理。解析不区分大小写。
It's https://docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html#getId--(您仅将其用于此默认格式化程序):
ID 与标准 ISO-8601 格式字符串略有不同
为偏移量。有以下三种格式:
- Z - UTC (ISO-8601)
- +hh:mm 或 -hh:mm - 如果秒为零 (ISO-8601)
- +hh:mm:ss 或 -hh:mm:ss - 如果秒非零(不是 ISO-8601)
(不
+hh
如 ISO-8601)。
看来 java.time (JDK 8) 并没有完全实现 ISO-8601。
This:
java.time.ZonedDateTime.parse("2015-08-18T00:00+01:00"); // works
对应于(大致来自 JDK 源代码):
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendOffsetId()
.toFormatter();
java.time.ZonedDateTime.parse("2015-08-18T00:00+01:00", formatter); // it's same
您可以创建自己的日期时间格式化程序 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html with 日期时间格式化程序生成器 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatterBuilder.html#appendPattern-java.lang.String-.
DateTimeFormatterBuilder builder2 = new DateTimeFormatterBuilder();
DateTimeFormatter formatter2 = builder2.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("X") // eg.:
.toFormatter();
java.time.ZonedDateTime.parse("2015-08-18T00:00+01", formatter2); // here you set +01
而不是使用appendOffsetId()追加模式(字符串模式) https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatterBuilder.html#appendPattern-java.lang.String-并设置“X”或“x”。
现在,您可以使用您的数据时间2015-08-18T00:00+01
.
或者...使用默认的 ISO_OFFSET_DATE_TIME 并添加后缀:00
.
java.time.ZonedDateTime.parse("2015-08-18T00:00+01" + ":00");
但这最后一个解决方案很糟糕。