我正在尝试使用以下格式解析"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)
我做错了什么?
模式字符串中的yyyy
表示纪元年份。严格来说,2014年可以表示公元前2014年("基督之前"(或公元2014年("纪元多米尼"(。显然,具有严格解析器样式的格式化程序反对这种歧义。
解决方案是使用uuuu
表示年份。这是一个签署的年份,其中 0 表示公元前 1 年,-1 表示公元前 2 年,依此类推。所以没有歧义:
System.out.println("********************"
+ OffsetDateTime.parse("20140726080320+0400",
DateTimeFormatter.ofPattern("uuuuMMddHHmmssZ")
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(STRICT))
.toEpochSecond());
这打印
****1406347400**
这与IsoChronology
解析不同解析器样式的日期的方式有关,如 javadoc 中所述:
如果只有YEAR_OF_ERA存在,并且模式是智能或宽松的,则假设当前时代(CE/AD(。在严格模式下,不假设纪元,YEAR_OF_ERA保持不变。
我的答案已经过时了,但我刚刚处理了一个类似的问题-(
如果要使用严格模式,并继续使用"yyyy"而不是"uuuu",则需要添加ERA的指示。我使用了默认值,如下所示:
OffsetDateTime.parse("20140726080320+0400",
new DateTimeFormatterBuilder()
.appendPattern("yyyyMMddHHmmssZ")
.parseDefaulting(ChronoField.ERA, 1)
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT)
);
此代码工作正常。我希望这对某人有所帮助。
试试这个:
LocalDateTime.parse("20140726080320+0400",
new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmssZ").toFormatter())
.atOffset(ZoneOffset.UTC)
回报:
2014-07-26T08:03:20
这是错误的,因为它忽略了偏移量(+0400(,然后将日期/时间设置为UTC - 这将为纪元秒提供不正确的值