java.text.ParseException: Nicht übertragbares Datum

7

Ich erhalte den folgenden Fehler: 'java.text.ParseException: Ungültiges Datum: "31. August 09:53:19 2011" 'mit diesem Format: new SimpleDateFormat("MMM dd HH:mm:ss yyyy");

Sieht jemand das Problem?

    
Stijn.V 31.08.2011, 08:17
quelle

3 Antworten

22

Stellen Sie sicher, dass Sie das richtige Gebietsschema verwenden. (Der SimpleDateFormat(String) -Konstruktor verwendet das Standardgebietsschema des Systems , das möglicherweise nicht das zu verwendende ist.)

Dies funktioniert auf meinem Rechner einwandfrei:

%Vor%

(Wenn Sie beispielsweise Locale.FRENCH verwenden, wird ParseException angezeigt.)

    
aioobe 31.08.2011, 08:22
quelle
4

Das Format selbst ist OK für die von Ihnen eingegebene Eingabe. Aber Sie können diesen Fehler erhalten, wenn Ihr Standardgebietsschema auf etwas eingestellt ist, wo "Aug" keine gültige Abkürzung für einen Monatsnamen ist. Verwenden Sie zum Beispiel Locale.US und Sie werden sehen, dass es funktioniert:

%Vor%     
Jesper 31.08.2011 08:23
quelle
2

tl; dr

%Vor%

Details

Die anderen beiden Antworten von aioobe und von Jesper sind beide korrekt: Implizit verwenden Sie eine Locale mit einer menschlichen Sprache, die nicht mit der Sprache Ihres Eingabetextes übereinstimmt.

Diese Antwort erklärt eine neue Art, die Aufgabe zu erledigen. Auch die anderen Antworten befassen sich nicht mit dem entscheidenden Thema der Zeitzone.

java.time

Machen Sie ein paar Jahre später einen schnellen Vorlauf von diesem Beitrag, und wir haben jetzt das neue java.time Paket in Java 8 und höher eingebaut. Diese neuen Klassen ersetzen das alte java.util.Date/.Calendar & amp; SimpleDateFormat-Klassen. Diese alten Klassen haben sich als problematisch, verwirrend und fehlerhaft erwiesen.

Formatierungsmuster

Definieren Sie die zu analysierenden Daten und ihr Format.

%Vor%

Wenn nicht angegeben, wird dem DateTimeFormatter das Locale zugewiesen, das derzeit der Standard in der JVM ist. Dieser Standard kann sich jederzeit ändern, auch während der Laufzeit (!). Geben Sie also immer die gewünschte / erwartete Locale an.

%Vor%

Da die Eingabe keine Zeitzonen- oder Offset-from- UTC Informationen enthält, analysieren Sie sie als LocalDateTime .

%Vor%

Wenn Sie den beabsichtigten Offset-von-UTC oder eine Zeitzone für diesen Datum-Uhrzeit-Wert aus dem Kontext kennen, ordnen Sie ihn zu.

Wenn UTC, verwenden Sie die Konstante ZoneOffset.UTC , um ein Objekt OffsetDateTime zu erhalten.

%Vor%

Eine Zeitzone ist ein Offset-von-UTC plus eine Reihe von Regeln für die Behandlung von Anomalien wie Sommerzeit (DST). Verwenden Sie richtige Zeitzonennamen , niemals die 3-4 Buchstaben Abkürzungen .

%Vor%

Geben Sie die Zeitzone an

Dieses menschliche Sprachelement war der Schlüssel, um die Frage zu beantworten. Die Angabe des korrekten Locale für die menschliche Sprache, die der Sprache Ihrer Eingabe entspricht, löst dieses Problem.

Beachten Sie jedoch, dass die Zeitzone ebenfalls kritisch ist. Die anderen Antworten ignorierten dieses Problem und verwendeten dabei implizit die aktuelle Standardzeitzone der JVM. Dies ist nicht ratsam, da es vom Hostbetriebssystem als anfänglicher Standardwert abhängt (und daher variieren kann). Darüber hinaus kann jeder Code in einem beliebigen Thread einer beliebigen App in der JVM die aktuelle Standardzeitzone der JVM während Laufzeit. Es ist besser, die gewünschte / erwartete Zeitzone anzugeben, als implizit auf die Standardeinstellung zu vertrauen.

Unveränderbare Objekte

Beachten Sie die Syntax. Diese Klassen sind so konzipiert, dass sie unveränderlich sind. Anstatt ein Objekt zu ändern (mutieren), wird ein neues Objekt basierend auf den Werten des alten Objekts erstellt. Dies bedeutet, dass nicht Auswirkungen auf die % co_de hat % Objekt oben definiert und in der DateTimeFormatter Variable (Objektreferenz) gespeichert. Wir erstellen, verwenden und verwerfen ein neues DateTimeFormatter-Objekt (eigentlich zwei neue Objekte) innerhalb dieser Codezeile.

Methodenreferenz

Die Dokumentation schlägt vor, dass eine alternative Methode zum Parsen eines Strings darin besteht, das formatter Methode, bei der Sie ein Methodenreferenz (neu in Java 8) aus der Klasse der gewünschten Art von Ergebnis (als parse ): TemporalQuery , ZonedDateTime::from , LocalDateTime::from und so weiter.

%Vor%

Zur Demonstration drehen wir uns um und erstellen eine String-Repräsentation dieses LocalDate::from -Wertes, aber in Québécois French.

%Vor%

Noch besser, lassen Sie uns ein bestimmtes Format lokalisieren und nicht hart codieren.

%Vor%

Dump zur Konsole.

%Vor%

Wenn ausgeführt.

%Vor%

Über java.time

Das Framework java.time ist in Java integriert 8 und später. Diese Klassen ersetzen die alten problematischen Datum-Zeit-Klassen wie ZonedDateTime , java.util.Date , & amp; %Code%.

Das Joda-Time Projekt, jetzt in Wartungsmodus , rät zur Migration auf java.time.

Weitere Informationen finden Sie im Oracle-Lernprogramm . Und durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen.

Viel von dem Java.Die Zeitfunktionalität wird auf Java 6 & amp; 7 in ThreeTen-Backport und weiter angepasst an Android in ThreeTenABP .

Das Projekt ThreeTen-Extra erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von java.time.

    
Basil Bourque 17.08.2015 22:29
quelle

Tags und Links