java.time.OffsetDateTime: 无法从 TemporalAccessor 获取 OffsetDateTime
java.time.OffsetDateTime: Unable to obtain OffsetDateTime from TemporalAccessor
我正在尝试使用 "yyyyMMddHHmmssZ"
格式解析 "20140726080320+0400"
,如下所示:
System.out.println("********************" + OffsetDateTime
.parse("20140726080320+0400",
DateTimeFormatter.ofPattern("yyyyMMddHHmmssZ").withChronology(IsoChronology.INSTANCE).withResolverStyle(STRICT))
.toEpochSecond());
我将 运行 保存到此异常中:
java.time.format.DateTimeParseException: Text '20140726080320+0400' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {OffsetSeconds=14400, DayOfMonth=26, YearOfEra=2014, MonthOfYear=7},ISO resolved to 08:03:20 of type java.time.format.Parsed
at java.time.format.Parsed.getLong(Parsed.java:203)
at java.time.Instant.from(Instant.java:373)
at java.time.OffsetDateTime.from(OffsetDateTime.java:365)
at java.time.format.Parsed.query(Parsed.java:226)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
我做错了什么?
试试这个:
LocalDateTime.parse("20140726080320+0400",
new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmssZ").toFormatter())
.atOffset(ZoneOffset.UTC)
return:
2014-07-26T08:03:20
这是错误的,因为它忽略了偏移量 (+0400),然后将 date/time 设置为 UTC - 这将为 epochSecond
提供不正确的值
yyyy
格式模式字符串中的年份。严格来说,2014 可以表示公元前 2014 年(“基督之前”)或公元 2014 年(“公元后”)。显然,具有严格解析器样式的格式化程序反对这种歧义。
一个解决方案是使用 uuuu
作为年份。这是一个有符号的年份,其中 0 表示 1 BCE,-1 表示 2 BCE 等。所以没有歧义:
System.out.println("********************"
+ OffsetDateTime.parse("20140726080320+0400",
DateTimeFormatter.ofPattern("uuuuMMddHHmmssZ")
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(STRICT))
.toEpochSecond());
这会打印
********************1406347400
这与 IsoChronology
为不同解析器样式解析日期的方式有关,如 javadoc:
中所述
If only the YEAR_OF_ERA is present, and the mode is smart or lenient, then the current era (CE/AD) is assumed. In strict mode, no era is assumed and the YEAR_OF_ERA is left untouched.
我正在尝试使用 "yyyyMMddHHmmssZ"
格式解析 "20140726080320+0400"
,如下所示:
System.out.println("********************" + OffsetDateTime
.parse("20140726080320+0400",
DateTimeFormatter.ofPattern("yyyyMMddHHmmssZ").withChronology(IsoChronology.INSTANCE).withResolverStyle(STRICT))
.toEpochSecond());
我将 运行 保存到此异常中:
java.time.format.DateTimeParseException: Text '20140726080320+0400' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {OffsetSeconds=14400, DayOfMonth=26, YearOfEra=2014, MonthOfYear=7},ISO resolved to 08:03:20 of type java.time.format.Parsed
at java.time.format.Parsed.getLong(Parsed.java:203)
at java.time.Instant.from(Instant.java:373)
at java.time.OffsetDateTime.from(OffsetDateTime.java:365)
at java.time.format.Parsed.query(Parsed.java:226)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
我做错了什么?
试试这个:
LocalDateTime.parse("20140726080320+0400",
new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmssZ").toFormatter())
.atOffset(ZoneOffset.UTC)
return:
2014-07-26T08:03:20
这是错误的,因为它忽略了偏移量 (+0400),然后将 date/time 设置为 UTC - 这将为 epochSecond
提供不正确的值yyyy
格式模式字符串中的年份。严格来说,2014 可以表示公元前 2014 年(“基督之前”)或公元 2014 年(“公元后”)。显然,具有严格解析器样式的格式化程序反对这种歧义。
一个解决方案是使用 uuuu
作为年份。这是一个有符号的年份,其中 0 表示 1 BCE,-1 表示 2 BCE 等。所以没有歧义:
System.out.println("********************"
+ OffsetDateTime.parse("20140726080320+0400",
DateTimeFormatter.ofPattern("uuuuMMddHHmmssZ")
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(STRICT))
.toEpochSecond());
这会打印
********************1406347400
这与 IsoChronology
为不同解析器样式解析日期的方式有关,如 javadoc:
If only the YEAR_OF_ERA is present, and the mode is smart or lenient, then the current era (CE/AD) is assumed. In strict mode, no era is assumed and the YEAR_OF_ERA is left untouched.