在Java 8中解决无法从TemporalAccessor获得LocalDateTime的问题

1,664 阅读2分钟

在这篇文章中,我们将看到如何在Java 8中解决无法从TemporalAccessor获得LocalDateTime的问题。

无法从TemporalAccessor中获得LocalDateTime。原因是什么

当你试图将字符串转换为LocalDateTime时,你通常会得到这个错误,而且格式化的字符串没有与时间相关的信息。

让我们在例子的帮助下了解一下。

package org.arpit.java2blog;

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

public class StringToLocalDateTime {

    public static void main(String[] args) {

        // Custom formatted String
        String dateStr = "2022-02-16";

        // Create DateTimeFormatter instance with specified format
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // Convert String to LocalDateTime using Parse() method
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr,dateTimeFormatter);

        // Print LocalDateTime object
        System.out.println("LocalDateTime obj: "+localDateTime);
    }
}

输出:=

Exception in thread "main" java.time.format.DateTimeParseException: Text '2022-02-16' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2022-02-16 of type java.time.format.Parsed
    at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
    at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at org.arpit.java2blog.StringToLocalDateTime.main(StringToLocalDateTime.java:17)
Caused by: java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2022-02-16 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:1948)
    ... 2 more
Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {},ISO resolved to 2022-02-16 of type java.time.format.Parsed
    at java.base/java.time.LocalTime.from(LocalTime.java:431)
    at java.base/java.time.LocalDateTime.from(LocalDateTime.java:457)
    ... 4 more

无法从TemporalAccessor获得LocalDateTime 修复

LocalDate的parse() 方法与atStartOfDay()

由于Formatted String不包含时间信息,我们需要使用LocalDate的parse() 方法并调用atStartOfDay() 方法来获得LocalDateTime 对象。

package org.arpit.java2blog;

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

public class StringToLocalDateTime {

    public static void main(String[] args) {

        // Custom formatted String
        String dateStr = "2022-02-16";

        // Create DateTimeFormatter instance with specified format
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // Convert String to LocalDateTime using LocalDate's parse() method
        LocalDateTime localDateTime = LocalDate.parse(dateStr,dateTimeFormatter).atStartOfDay();

        // Print LocalDateTime object
        System.out.println("LocalDateTime obj: "+localDateTime);
    }
}

输出。

LocalDateTime obj: 2022-02-16T00:00

使用LocalDate而不是LocalDateTime

由于格式化的String不包含时间信息,我们可能想使用LocalDate ,而不是LocalDateTime

我们可以使用LocalDate的parse() 方法,在Java中把String转换为LocalDate。

package org.arpit.java2blog;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class StringToLocalDate {

    public static void main(String[] args) {
        // Custom formatted String
        String dateStr = "2022-02-16";

        // Create DateTimeFormatter instance with specified format
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // Convert String to LocalDateTime using LocalDate's parse() method
        LocalDate localDate = LocalDate.parse(dateStr,dateTimeFormatter);

        // Print LocalDateTime object
        System.out.println("LocalDate obj: "+localDate);
    }
}

输出。

LocalDate obj: 2022-02-16