Die java-Fehlermeldung.Zeit.format.DateTimeParseException: konnte nicht analysiert werden, ungeparsten text gefunden bei index 10
Im Versuch, pase die nächste Zeichenfolge mit LocalDateTime, aber ich bekomme immer de ungeparsten text gefunden Fehler:
Error java.time.format.DateTimeParseException: Text '2016-08-18 14:27:15.103+02' could not be parsed, unparsed text found at index 10
Hier ist mein String: convertDate: '2016-08-18 14:27:15.103+02'
Und mein code:
public static LocalDate conversorStringToLocalDateTime(String convertDate) throws ParseException {
LocalDate dateTime =LocalDate.parse(convertDate);
return dateTime;
}
Denke ich mal ist nicht allzu kompliziert, kaufen, ich bin nicht in der Lage, um zu sehen der Fehler. Könnte die +02 in der Zeichenfolge die Ursache sein?
Ich denke, dass ist der Raum zwischen dem Datum und der Uhrzeit. Ist, dass ein space char oder ein non-breaking-space? Wenn Ihr string kommt aus einer form von einer Art, die möglicherweise einen anderen char als einen Raum
Es stammt aus einer Postgre-Datenbank
Es stammt aus einer Postgre-Datenbank
InformationsquelleAutor Asier Pomposo | 2016-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
tl;dr
Details
Den Antwort von greg-449 richtig über das problem (mit einem nur-Datum-Objekt für ein Datum-Zeit-Wert), nicht aber die Lösung.
Diese Antwort verwendet
LocalDateTime
die unnötig wegwirft wertvolle Informationen über die offset von UTC. EinLocalDateTime
hat nicht repräsentieren einen bestimmten Zeitpunkt auf der timeline, nur eine vage Vorstellung über mögliche Momente je nach Einstellung in einer bestimmten Zeitzone.Den
+02
ist ein offset von UTC mit der Bedeutung "zwei Stunden vor UTC". So in UTC-Zeit-von-Tag für das gleichzeitige moment 12 Stunden, 2 Stunden weniger als Ihre 14 Stunden. Diese hat repräsentieren einen bestimmten Zeitpunkt auf der Zeitachse. Dieser offset ist durch die wertvollen Informationen, die Sie wegwerfen, mit einLocalDateTime
eher als eineOffsetDateTime
.Das format der Zeichenfolge ist im SQL-format, die nahe an der Norm ISO 8601-format. Nur ersetzen Sie das LEERZEICHEN in der Mitte mit einem
T
. Die java.Zeit-Klassen verwenden ISO-8601-Formate standardmäßig, so dass keine Notwendigkeit, um anzugeben, ein Formatierungs-Muster.Leider Java 8 hat einen bug im parsing-offset-Werte abgekürzt, nur eine Stunde oder offset-Werte weglassen der Doppelpunkt zwischen Stunden und Minuten. Feste in Java 9. Aber in Java 8, die wir brauchen, um das Eingangssignal anpassen.
Nun analysieren.
Dump in die Konsole. Beachten Sie, wie wir verwandelt
+02
in+02:00
.Geben Sie alternativ ein Formatierungs-Muster. Die offset-parsing-bug, beißen nicht, wenn mit dieser Formatierung Muster.
Datenbank
Kommen aus Postgres, sollten Sie das abrufen der Wert als Datums-Zeit-Objekt, anstatt ein String.
Wenn Ihr JDBC-Treiber entspricht mit JDBC 4.2 Sie können call
ResultSet::getObject
um eineInstant
oderOffsetDateTime
. Wenn nicht, rufen SieResultSet::getTimestamp
zu bekommenjava.sql.Timestamp
, dann sofort konvertieren java.AufruftoInstant
auf der Zeitstempel-Objekt.Stick mit java.Zeit für Ihre business-Logik, die java.sql-Typen kurz und nur für den Austausch mit der Datenbank.
InformationsquelleAutor Basil Bourque
Ihren code
LocalDate
denen nur ein Datum analysiert - nicht ein Datum und eine Uhrzeit, so dass Sie immer einen Fehler beim Parsen findet das Leerzeichen nach dem Datum.So, Sie sollten mit
LocalDateTime
aberLocalDateTime.parse(String)
erwartet Sie ein ISO-format Datum, das nicht das format, das Sie verwenden.So dass Sie brauchen, um eine
DateTimeFormatter
angeben, das format der Eingabe-string. So etwas wie:InformationsquelleAutor greg-449