解析LocalDateTime时无法从TemporalAccessor获取LocalDateTime(Java 8)

时间:2014-12-13 00:04:04

标签: java datetime java-8 datetime-format

我只是想在Java 8中将日期字符串转换为DateTime对象。运行以下行:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

我收到以下错误:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20140218' could not be parsed: 
Unable to obtain LocalDateTime from TemporalAccessor: 
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)

语法与建议here的语法相同,但我遇到了异常。我正在使用JDK-8u25

10 个答案:

答案 0 :(得分:129)

事实证明,Java不接受Date Date值作为DateTime。使用LocalDate而不是LocalDateTime解决了这个问题:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);

答案 1 :(得分:53)

如果您确实需要将日期转换为LocalDateTime对象,则可以使用LocalDate.atStartOfDay()。这将在指定日期为您提供LocalDateTime对象,将小时,分钟和秒字段设置为0:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();

答案 2 :(得分:36)

如果有人应该再读一遍这个主题(比如我),那么正确的答案将是DateTimeFormatter定义,例如:

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

如果出现可选字段,则应设置它们。其余的代码应完全相同。

答案 3 :(得分:28)

这是一个非常不清楚且无用的错误消息。经过多次试验和错误,我发现如果您不尝试解析时间LocalDateTime将会出现上述错误。通过使用LocalDate代替,它可以正常运行。

这个记录很少,相关的例外情况非常无益。

答案 4 :(得分:18)

扩展retrography's answer ..:即使使用LocalDate而非LocalDateTime,我也遇到了同样的问题。问题是我使用DateTimeFormatter创建了.withResolverStyle(ResolverStyle.STRICT);,因此我不得不使用日期模式uuuuMMdd而不是yyyyMMdd(即“年”代替“年份” -era“)!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(此解决方案最初是对回顾的答案的评论,但我鼓励将其作为一个独立的答案发布,因为它显然对许多人来说非常有效。)

答案 5 :(得分:13)

对于任何在此处遇到此错误的人,就像我一样:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

它来自以下一行:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

事实证明,这是因为我在0小时内使用的是12小时模式,而不是24小时模式。

使用大写H将小时更改为24小时模式修复它:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

答案 6 :(得分:10)

如果日期字符串不包含小时,分钟等任何值,则无法将其直接转换为LocalDateTime。您只能将其转换为LocalDate,因为字符串 代表 年,月和日期组件,它将是正确的事情要做。

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

无论如何,您可以将其转换为LocalDateTime

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

答案 7 :(得分:1)

尝试这个:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

您可以添加所需的任何格式。对我有用!

答案 8 :(得分:1)

这很好

public class DateDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
        String date = "16-08-2018 12:10";
        LocalDate localDate = LocalDate.parse(date, formatter);
        System.out.println("VALUE="+localDate);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime parse = LocalDateTime.parse(date, formatter1);
        System.out.println("VALUE1="+parse);
    }
}

输出:

VALUE=2018-08-16
VALUE1=2018-08-16T12:10

答案 9 :(得分:0)

我遇到这个问题是因为我的输入字符串中没有年份:

输入字符串:Tuesday, June 8 at 10:00 PM
格式化程序:DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a", Locale.US);

我知道年份,所以我只是附加它以获得:

输入字符串:Tuesday, June 8 at 6:30 PM 2021
格式化程序:DateTimeFormatter.ofPattern("EEEE, MMMM d 'at' h:mm a uuuu", Locale.US);