我正在以两种略有不同的格式解析同一日期,但遇到了我不理解的错误。
成功解析标准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的定义的理解 建议第二次解析应该成功。我在做什么错了?
答案 0 :(得分:3)
我相信合理的思考方式是:从概念上讲不是一个日期和时间。就是这样,瞬间。它没有时区或偏移,因此不能有日期和时间。由于LocalDateTime
需要一天中的日期和时间,因此瞬间解析不会满足您的需求。
是的,我知道:Instant
的实现使用自该纪元以来的时间,而迄今为止最常见的纪元定义是使用UTC。我也知道您正在解析的字符串包含日期和一天中的时间,并且DateTimeFormatter.ISO_INSTANT
和Instant.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
(符合预期)。