Ich versuche einfach, eine Datumszeichenfolge in ein DateTime-Objekt in Java 8 zu konvertieren. Beim Ausführen der folgenden Zeilen:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
Ich erhalte folgende Fehlermeldung:
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 hier vorgeschlagen wurde , aber ich werde mit einer Ausnahme bedient. Ich benutze JDK-8u25
.
java
datetime
java-8
datetime-format
Retrographie
quelle
quelle
LocalDate
und nichtLocalDateTime
. Das Problem war, dass ich meineDateTimeFormatter
Verwendung erstellt hatte.withResolverStyle(ResolverStyle.STRICT);
, also musste ich DatumsmusteruuuuMMdd
anstelle vonyyyyMMdd
(dh "Jahr" anstelle von "Jahr der Ära") verwenden!Wenn Sie ein Datum wirklich in ein LocalDateTime-Objekt umwandeln müssen, können Sie LocalDate.atStartOfDay () verwenden. Dadurch erhalten Sie zum angegebenen Datum ein LocalDateTime-Objekt, dessen Felder Stunde, Minute und Sekunde auf 0 gesetzt sind:
quelle
LocalDateTime.from
scheint unnötig, daatStartOfDay()
schon zurückLocalDateTime
.Für was ist es wert, wenn jemand dieses Thema noch einmal lesen sollte (wie ich), wäre die richtige Antwort in
DateTimeFormatter
Definition, zB:Man sollte die optionalen Felder festlegen, wenn sie angezeigt werden. Und der Rest des Codes sollte genau der gleiche sein.
quelle
parseDefaulting
NACH dem Aufruf hinzuzufügenappendPattern
. Sonst wird es gebenDateTimeParseException
.Dies ist eine wirklich unklare und nicht hilfreiche Fehlermeldung. Nach langem Ausprobieren habe ich festgestellt,
LocalDateTime
dass der obige Fehler angezeigt wird, wenn Sie nicht versuchen, eine Zeit zu analysieren. Wenn SieLocalDate
stattdessen verwenden, funktioniert dies ohne Fehler.Dies ist schlecht dokumentiert und die damit verbundene Ausnahme ist sehr wenig hilfreich.
quelle
Erweiterung der Antwort der Retrographie ..: Ich hatte das gleiche Problem, auch wenn ich es benutzte
LocalDate
und nichtLocalDateTime
. Das Problem war, dass ich meineDateTimeFormatter
Verwendung erstellt hatte.withResolverStyle(ResolverStyle.STRICT);
, also musste ich DatumsmusteruuuuMMdd
anstelle vonyyyyMMdd
(dh "Jahr" anstelle von "Jahr der Ära") verwenden!(Diese Lösung war ursprünglich ein Kommentar zur Antwort der Retrographie, aber ich wurde ermutigt, sie als eigenständige Antwort zu veröffentlichen, da sie anscheinend für viele Menschen sehr gut funktioniert.)
quelle
Für alle, die mit diesem Fehler hier gelandet sind, wie ich:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
Es kam aus einer der folgenden Zeilen:
Es stellte sich heraus, dass ich ein 12-Stunden-Muster für eine 0-Stunde anstelle eines 24-Stunden-Musters verwendete.
Durch Ändern des Stunden- auf 24-Stunden-Musters mithilfe eines Großbuchstaben H wird Folgendes behoben:
quelle
Wenn die Datumszeichenfolge keinen Wert für Stunden, Minuten usw. enthält, können Sie diesen nicht direkt in a konvertieren
LocalDateTime
. Sie können es auf ein nur konvertierenLocalDate
, da die Zeichenfolge nur repräsentieren die Jahr, Monat und Datum Komponenten wäre es die richtige Sache zu tun.Auf jeden Fall können Sie dies in konvertieren
LocalDateTime
.quelle
yyyy-mm-dd
es hätte sein sollenyyyy-MM-dd
.Probier diese:
Sie können jedes gewünschte Format hinzufügen. Das ist für mich in Ordnung!
quelle
Das funktioniert gut
Ausgabe:
quelle