【问题标题】:java.time.format.DateTimeParseException at LocalDateTime.parseLocalDateTime.parse 处的 java.time.format.DateTimeParseException
【发布时间】:2018-03-02 09:30:03
【问题描述】:

为什么会出现以下代码:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class TestProject {

    public static void main(String[] args) {
        String dateString = "2018-03-01T14:52:48Z";
        DateTimeFormatter dtf = DateTimeFormatter.ISO_INSTANT;
        LocalDateTime localDateTime = LocalDateTime.parse(dateString, dtf);
    }
}

抛出:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2018-03-01T14:52:48Z' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1519915968, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed
    at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1959)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1894)
    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at org.bdshadow.TestProject.main(TestProject.java:11)
Caused by: java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1519915968, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed
    at java.base/java.time.LocalDateTime.from(LocalDateTime.java:461)
    at java.base/java.time.format.Parsed.query(Parsed.java:235)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890)
    ... 2 more
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1519915968, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed
    at java.base/java.time.LocalDate.from(LocalDate.java:396)
    at java.base/java.time.LocalDateTime.from(LocalDateTime.java:456)
    ... 4 more

日期的字符串表示形式与 DateTimeFormatter.ISO_INSTANT 的 javadocs 中的完全一样:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT。它在 java 9 中没有改变:https://docs.oracle.com/javase/9/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT

【问题讨论】:

    标签: java


    【解决方案1】:

    我相信是因为ISO_INSTANT 用于解析Instant

    正如 javadoc 所说:

    这是一个特殊的格式化程序,旨在允许java.time.Instant 的人类可读形式。

    此代码有效:

        String dateString = "2018-03-01T14:52:48Z";
        DateTimeFormatter dtf = DateTimeFormatter.ISO_INSTANT;
        Instant instant = Instant.from(dtf.parse(dateString));
    

    要使其成为本地日期时间,您可以使用:

    LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
    

    这是对此类错误的一个很好的解释: Java SE 8 TemporalAccessor.from issues when used with a java.time.Instant object

    【讨论】:

      【解决方案2】:

      LocalDateTimet contain Zone in self. If you need parse string with zone useZonedDateTime`:

      DateTimeFormatter dtf = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault());
      ZonedDateTime dateTime = ZonedDateTime.parse(dateString, dtf);
      

      【讨论】:

      • 我的字符串中也没有区域。而且 DateTimeFormatter.ISO_INSTANT 也没有区域:来自文档的“即时日期和时间”:docs.oracle.com/javase/8/docs/api/java/time/format/…。所以我不想用区域解析它。鲁斯兰的回答在这里更正确。尤其是指向其他问题的链接有助于解释 Instant。
      猜你喜欢
      • 2017-05-31
      • 2018-04-04
      • 2018-12-12
      • 2020-12-15
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2018-11-19
      • 2016-09-07
      相关资源
      最近更新 更多