Frage Kann LocalDateTime von TemporalAccessor nicht erhalten, wenn LocalDateTime (Java 8) analysiert


Ich versuche einfach, eine Date-Zeichenfolge in ein DateTime-Objekt in Java 8 zu konvertieren. Nach dem Ausführen der folgenden Zeilen:

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

Ich erhalte den folgenden Fehler:

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)

Die Syntax ist identisch mit dem, was vorgeschlagen wurde Hieraber ich habe eine Ausnahme. ich benutze JDK-8u25.


75
2017-12-13 00:04


Ursprung


Antworten:


Es stellt sich heraus, dass Java keinen reinen Date-Wert als DateTime akzeptiert. Die Verwendung von LocalDate anstelle von LocalDateTime löst das Problem:

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

98
2017-12-13 00:20



Wenn Sie ein Datum wirklich in ein LocalDateTime-Objekt transformieren müssen, könnten Sie LocalDate.atStartOfDay () verwenden. Dadurch erhalten Sie ein LocalDateTime-Objekt zum angegebenen Datum, wobei die Stunden-, Minuten- und Sekundenfelder auf 0 gesetzt sind:

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

37
2017-10-01 11:33



Dies ist eine sehr unklare und wenig hilfreiche Fehlermeldung. Nach viel Versuch und Irrtum fand ich das LocalDateTime gibt den obigen Fehler, wenn Sie nicht versuchen, eine Zeit zu analysieren. Durch die Nutzung LocalDate Stattdessen funktioniert es ohne Fehler.

Dies ist schlecht dokumentiert und die entsprechende Ausnahme ist sehr wenig hilfreich.


24
2018-01-26 23:33



Für was ist es wert, wenn jemand dieses Thema (wie mich) nochmal lesen sollte, wäre die richtige Antwort drin DateTimeFormatter Definition, z.B.

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

Man sollte die optionalen Felder festlegen, wenn sie angezeigt werden. Und der Rest des Codes sollte genau gleich sein.


21
2017-09-25 09:11



Erweiterung auf die Antwort der Retrografie..: Ich hatte das gleiche Problem, auch wenn ich es benutze LocalDate und nicht LocalDateTime. Das Problem war, dass ich meine erstellt hatte DateTimeFormatter verwenden .withResolverStyle(ResolverStyle.STRICT);, also musste ich das Datumsmuster verwenden uuuuMMdd Anstatt von yyyyMMdd (d. h. "Jahr" anstelle von "Jahr der Ära")!

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

(Diese Lösung war ursprünglich ein Kommentar zur Antwort von Retrography, aber ich wurde ermutigt, sie als Stand-Alone-Antwort zu veröffentlichen, weil sie anscheinend für viele Leute wirklich gut funktioniert.)


13
2018-04-28 08:10



Wenn der Datumsstring keinen Wert für Stunden, Minuten und usw. enthält, können Sie diesen Wert nicht direkt in a umwandeln LocalDateTime. Sie können es nur in a konvertieren LocalDate, weil die Zeichenfolge nur  vertreten das Jahr, Monat und Datum Komponenten wäre es die richtige Sache zu tun.

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

Wie auch immer, Sie können dies in konvertieren 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

5
2018-03-12 09:38



Für jeden, der hier mit diesem Fehler gelandet ist, wie ich es tat:

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

Es kam aus einer folgenden Zeile:

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

Es stellte sich heraus, dass es daran lag, dass ich ein 12-Stunden-Muster für eine 0-Stunden-Zeit anstelle eines 24-Stunden-Kurses verwendete.

Ändern Sie die Stunde zu 24-Stunden-Muster mit einem Großbuchstaben H behebt es:

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

2
2018-05-17 19:18