我试图使用"20140726080320+0400"格式解析"yyyyMMddHHmmssZ",如下所示:
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)我做错了什么?
发布于 2018-01-15 15:19:17
yyyy中的格式模式字符串是时代的一年。严格地说,2014年可以指公元前2014年(“基督之前”)或2014年(“anno Domini”)。显然,具有严格解析器样式的格式化程序对象具有此歧义。
解决方案之一是在一年内使用uuuu。这是一个签字的年份,0表示公元前1,-1表示公元前2,等等。所以没有歧义:
System.out.println("********************"
+ OffsetDateTime.parse("20140726080320+0400",
DateTimeFormatter.ofPattern("uuuuMMddHHmmssZ")
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(STRICT))
.toEpochSecond());这个指纹
*
这与IsoChronology解析不同解析程序样式的日期的方式有关,如javadoc中所述。
如果只存在YEAR_OF_ERA,并且该模式是智能的或宽松的,则假定当前时代(CE/AD)。在严格的模式下,没有一个时代被假定,YEAR_OF_ERA被保持不变。
发布于 2018-01-15 14:20:27
试试这个:
LocalDateTime.parse("20140726080320+0400",
new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmssZ").toFormatter())
.atOffset(ZoneOffset.UTC)回报:
2014-07-26T08:03:20
这是错误的,因为它忽略了偏移量(+0400),然后将日期/时间设置为UTC -这将为epochSecond提供一个不正确的值。
https://stackoverflow.com/questions/48263389
复制相似问题