在这篇文章中,我们将看到如何在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