LocalDateTime.parse处的java.time.format.DateTimeParseException

bds*_*dow 1 java

为什么执行以下代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

扔:

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
Run Code Online (Sandbox Code Playgroud)

日期的字符串表示形式与javadocs中的完全一样DateTimeFormatter.ISO_INSTANT: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

Rus*_*dov 5

我相信它是因为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));
Run Code Online (Sandbox Code Playgroud)

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

LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
Run Code Online (Sandbox Code Playgroud)

这是关于此类错误的一个很好的解释: Java SE 8 TemporalAccessor.from与java.time.Instant对象一起使用时的问题