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


150

我只是想将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)

语法与此处建议的语法相同,但有例外。我正在使用JDK-8u25

Answers:


177

事实证明Java不接受裸露的Date值作为DateTime。使用LocalDate代替LocalDateTime解决了此问题:

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

42
到底值多少钱:即使使用LocalDate和时,我也遇到同样的问题LocalDateTime。问题是我创建了DateTimeFormatterusing .withResolverStyle(ResolverStyle.STRICT);,所以我不得不使用日期模式uuuuMMdd而不是yyyyMMdd(即“ year”而不是“ year-of-era”)!
ZeroOne

71

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

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

2
校正:设置为当天开始的任何时间
Trejkaz

20
LocalDateTime.from似乎没有必要,因为atStartOfDay()已经返回了LocalDateTime
Dariusz

1
scala:val time = LocalDate.parse(“ 20171220”,DateTimeFormatter.ofPattern(“ yyyyMMdd”))。atStartOfDay.format(DateTimeFormatter.ofPattern(“ yyyy-MM-dd HH:mm:ss”))
伍迪

48

对于任何人(如我)应该再次阅读此主题的意义,正确的答案将在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(); 

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


1
例如,对于这种方法,这是真正的通用解决方案:Long getFileTimestamp(String file,Pattern pattern,DateTimeFormatter dtf,int group); 在这里,您有不同的模式和DateTimeFormetter,指定了w / o时间。
toootooo

可以是静态字段吗?我没有在Javadoc中发现以这种方式创建的实例是线程安全的
Kamil Roman

记住添加parseDefaulting您调用过的AFTER appendPattern。否则会给DateTimeParseException
wittyameta

31

这是一个非常不清楚和没有帮助的错误消息。经过多次尝试和错误,我发现LocalDateTime如果您不尝试解析时间,它将给出上述错误。通过使用LocalDate它,它可以正常工作而不会出错。

这没有充分的文档记录,并且相关的异常非常无用。


25

扩大回顾的答案 ..:即使使用LocalDate和也不存在相同的问题LocalDateTime。问题是我创建了DateTimeFormatterusing .withResolverStyle(ResolverStyle.STRICT);,所以我不得不使用日期模式uuuuMMdd而不是yyyyMMdd(即“ year”而不是“ year-of-era”)!

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

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


1
这个问题的答案,为什么“U”代替“Y”已在这个环节上回答UUUU抗YYYY-在-datetimeformatter格式化模式码,在Java的 @Peru
普拉香特

23

对于任何因此错误而降落此处的人,就像我所做的那样:

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"));

12

如果日期字符串不包含小时,分钟等的任何值,则无法将其直接转换为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

还要确保格式正确。直到因为我将格式设置为yyyy-mm-dd应该设置的格式,这个修复才对我有用yyyy-MM-dd
patstuart

0

试试这个:

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

您可以添加任何所需的格式。这对我行得通!


0

这很好

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.