首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.time.OffsetDateTime:无法从TemporalAccessor获得OffsetDateTime

java.time.OffsetDateTime:无法从TemporalAccessor获得OffsetDateTime
EN

Stack Overflow用户
提问于 2018-01-15 12:49:58
回答 2查看 3.4K关注 0票数 2

我试图使用"20140726080320+0400"格式解析"yyyyMMddHHmmssZ",如下所示:

代码语言:javascript
复制
System.out.println("********************" + OffsetDateTime
    .parse("20140726080320+0400",
        DateTimeFormatter.ofPattern("yyyyMMddHHmmssZ").withChronology(IsoChronology.INSTANCE).withResolverStyle(STRICT))
    .toEpochSecond()); 

我经常遇到这样的异常:

代码语言:javascript
复制
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)

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-15 15:19:17

yyyy中的格式模式字符串是时代的一年。严格地说,2014年可以指公元前2014年(“基督之前”)或2014年(“anno Domini”)。显然,具有严格解析器样式的格式化程序对象具有此歧义。

解决方案之一是在一年内使用uuuu。这是一个签字的年份,0表示公元前1,-1表示公元前2,等等。所以没有歧义:

代码语言:javascript
复制
    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被保持不变。

票数 2
EN

Stack Overflow用户

发布于 2018-01-15 14:20:27

试试这个:

代码语言:javascript
复制
LocalDateTime.parse("20140726080320+0400",
    new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmssZ").toFormatter())
.atOffset(ZoneOffset.UTC)

回报:

2014-07-26T08:03:20

这是错误的,因为它忽略了偏移量(+0400),然后将日期/时间设置为UTC -这将为epochSecond提供一个不正确的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48263389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档