为什么我的日期时间解析尝试失败?

时间:2018-06-21 05:35:24

标签: java parsing datetime java-8 java-time

我正在以两种略有不同的格式解析同一日期,但遇到了我不理解的错误。

成功解析标准ISO格式的字符串:

var header = ".//h1[@class='flexgrid-col' and contains(text(),'Live Dev')]";
/* Verify Live Dev Headers */
driver.wait(until.elementLocated(driver.findElement(by.xpath(header)),10000)).then(function(){
    console.log(chalk.green("Header Verified"));
});
driver.quit();

但是,当我加一个 String s = "2018-04-17T22:57:29"; LocalDateTime date = LocalDateTime.parse(s, DateTimeFormatter.ISO_DATE_TIME); // OK 后缀并以此方式使用"Z"时:

ISO_INSTANT

我收到以下异常:

    s = "2018-04-17T22:57:29Z";
    date = LocalDateTime.parse(s, DateTimeFormatter.ISO_INSTANT); // Fails

我对ISO_INSTANT的定义的理解  建议第二次解析应该成功。我在做什么错了?

1 个答案:

答案 0 :(得分:3)

我相信合理的思考方式是:从概念上讲不是一个日期和时间。就是这样,瞬间。它没有时区或偏移,因此不能有日期和时间。由于LocalDateTime需要一天中的日期和时间,因此瞬间解析不会满足您的需求。

是的,我知道:Instant实现使用自该纪元以来的时间,而迄今为止最常见的纪元定义是使用UTC。我也知道您正在解析的字符串包含日期和一天中的时间,并且DateTimeFormatter.ISO_INSTANTInstant.toString都生成相似的字符串。不过,这是界面,并不会告诉您即时的概念是什么。

  

我对ISO_INSTANT定义的阅读表明,第二个   解析应该成功。

我知道可以用这种方式读取定义。我认为这值得注意,但是:

  

…即时从ChronoField.INSTANT_SECONDS和   ChronoField.NANO_OF_SECOND…

虽然纳秒与LocalDateTime之类的其他日期时间类型共享,但提到的两个字段不足以为您获取LocalDateTime的数据。所以这是为您服务的地方。要获得LocalDateTime,我们需要假设一个时区或偏移量。即使引用继续:

  

...使用UTC偏移量。

-这仅意味着将UTC偏移量用于计算秒秒和毫微秒,而不用于进一步处理。

我们也可以尝试更仔细地研究您的错误消息:

  

线程“ main”中的异常java.time.format.DateTimeParseException:   无法解析文字'2018-04-17T22:57:29Z':无法获取   来自TemporalAccessor的LocalDateTime:{MicroOfSecond = 0,NanoOfSecond = 0,   MilliOfSecond = 0,InstantSeconds = 1524005849},ISO类型   java.time.format.Parsed

这还表示,我们从解析中得到的只是瞬间秒(即自时代以来的秒)和几分之一秒(以及ISO时间顺序)。而且这还不足以获得LocalDateTime

您并不是第一个(也不是最后一个)感到惊讶的人。不过,您观察到的行为是设计使然。

修复

ISO_INSTANT的定义还提到:

  

ISO_OFFSET_DATE_TIME

这可行:

    String s = "2018-04-17T22:57:29Z";
    LocalDateTime date = LocalDateTime.parse(s, DateTimeFormatter.ISO_OFFSET_DATE_TIME);

结果为2018-04-17T22:57:29(符合预期)。