HOWTO · Java

Beheben Sie den Fehler java.text.ParseException: Unparseable date in Java

Dieses Tutorial demonstriert java.text.ParseException: Unparseable date error in Java.

Auf dieser Seite

Dieser Leitfaden erklärt, wie Sie java.text.ParseException: Unparseable date diagnostizieren, wenn eine Java-Datumszeichenfolge nicht zum Parsing-Muster passt. Vergleichen Sie die Eingabe von links nach rechts mit dem Muster und berücksichtigen Sie anschließend lokalisierte Texte und Zeitzonen, bevor Sie den geparsten Wert formatieren.

Den Fehler java.text.ParseException: Unparseable date in Java beheben

SimpleDateFormat parst Text anhand von Musterzeichen; es errät nicht das beabsichtigte Datumsformat. Ein Parsing-Fehler bedeutet meist, dass das Muster andere Felder oder Texte erwartet, als die Eingabe enthält. Beispielsweise beginnt Tue Aug 16 12:30:10 IST 2022 mit einem Wochentag, gefolgt von einem englischen Monatsnamen, einem Tag, einer Uhrzeit, einer Zeitzonenabkürzung und einem Jahr. Ein Muster wie MMM d, yyyy HH:mm:ss erwartet andere Satzzeichen und lässt Wochentag und Zeitzone aus. Daher kann es diese Zeichenfolge nicht wie angegeben vollständig einlesen.

Untersuchen Sie die vollständige Eingabe einschließlich Trennzeichen und Leerzeichen. Prüfen Sie Wochentag, Monatsnamen, Tag, Uhrzeitfelder, Zeitzone und Jahr. Eine ParseException gibt die Position an, an der das Parsing abgebrochen wurde. Vergleichen Sie den Text an dieser Stelle mit dem nächsten vom Muster erwarteten Feld. Nehmen Sie nicht an, dass eine abweichende Zeitzone allein die Ursache dieser Ausnahme ist: Eine Zeitzone beeinflusst in der Regel den dargestellten Zeitpunkt oder dessen Anzeige.

Das Datumsformat an die Eingabezeichenfolge anpassen

Musterzeichen unterscheiden zwischen Groß- und Kleinschreibung. MM steht für den Monat, mm für Minuten. Verwenden Sie yyyy für das Kalenderjahr; YYYY in Großbuchstaben bezeichnet das Wochenjahr und kann nahe einem Jahreswechsel zu unerwarteten Ergebnissen führen. Auch Anzahl und Reihenfolge der Felder müssen zur Eingabe passen. Für den angegebenen Datumstext benötigt das Muster einen Wochentag (EEE), einen abgekürzten Monatsnamen (MMM), einen zweistelligen Tag (dd), eine Uhrzeit im 24-Stunden-Format (HH:mm:ss), eine Zeitzone (z) und ein Jahr (yyyy).

Für die Diagnose können Sie Eingabe und Muster nebeneinander schreiben und die einzelnen Bestandteile der Reihe nach zuordnen. Enthält der Text numerische Monats- und Tagesangaben, verwenden Sie ein numerisches Muster mit derselben Reihenfolge und denselben Trennzeichen. Enthält er einen Monatsnamen, verwenden Sie ein Muster für Monatsnamen. Ändern Sie nicht einfach die Groß- und Kleinschreibung eines Musterzeichens, ohne zuvor seine Bedeutung zu prüfen.

Gebietsschema und Zeitzone beim Parsing bewusst festlegen

Monats- und Wochentagsnamen als Text hängen vom Gebietsschema ab. Wenn die Eingabe englische Namen enthält, übergeben Sie Locale.ENGLISH, anstatt sich auf das Standardgebietsschema des Rechners zu verlassen. Dieses kann auf Entwicklungsrechnern und Servern unterschiedlich sein. Verwenden Sie das Gebietsschema, in dem der Text erstellt wurde, und legen Sie es ausdrücklich fest, damit der Parser dieselben Monats- und Wochentagsnamen erwartet.

Eine Datumszeichenfolge mit Zeitzone enthält Informationen, die für die Interpretation der Uhrzeit benötigt werden. Zeitzonenabkürzungen wie IST können je nach Region und Datenquelle mehrdeutig sein. Bevorzugen Sie bei selbst festgelegten Formaten einen eindeutigen numerischen Offset oder eine Zeitzonenkennung für eine Region. Prüfen Sie bei vorhandenem Text, was die Abkürzung für dessen Erzeuger bedeutet. Legen Sie beim Formatieren eine Zeitzone ausdrücklich fest, damit die angezeigte Uhrzeit nicht unbemerkt von der Zeitzone des Hostrechners abhängt. Das beeinflusst Interpretation oder Anzeige, behebt aber keine unpassenden Datumsfelder.

Ein vollständiges Beispiel für Parsing und Ausgabeformatierung ausführen

Beim nicht passenden Muster MMM d, yyyy HH:mm:ss schlägt das Parsing der angegebenen Eingabe mit new SimpleDateFormat("MMM d, yyyy HH:mm:ss", Locale.ENGLISH).parse(input) fehl, weil das Muster am Anfang einen Monatsnamen erwartet, die Eingabe aber mit einem Wochentag beginnt. Die resultierende Ausnahme lautet java.text.ParseException: Unparseable date: "Tue Aug 16 12:30:10 IST 2022". Das korrigierte Muster unten berücksichtigt Wochentag, Monat, Tag, Uhrzeit, Zeitzone und Jahr. Es verwendet das englische Gebietsschema und formatiert den geparsten Zeitpunkt in UTC. Damit die angezeigte Ausgabe eindeutig ist, verwendet dieses Beispiel in der Eingabe UTC statt der oben gezeigten mehrdeutigen Abkürzung IST. Wenn Sie das Eingabeformat selbst festlegen, bevorzugen Sie im Anwendungscode eine eindeutige Zeitzonenangabe.

Führen Sie dieses Beispiel aus. Der unveränderte Code und die angezeigte Ausgabe enthalten englische Bezeichnungen und bleiben auf Englisch.

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class ParseDateExample {
    public static void main(String[] args) {
        String input = "Tue Aug 16 10:30:10 UTC 2022";
        SimpleDateFormat parser = new SimpleDateFormat(
                "EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
        ParsePosition position = new ParsePosition(0);
        Date parsed = parser.parse(input, position);
        if (parsed == null || position.getIndex() != input.length()) {
            System.out.println("Input did not match the pattern.");
            return;
        }

        SimpleDateFormat display = new SimpleDateFormat(
                "EEE MMM d, yyyy HH:mm:ss 'UTC'", Locale.ENGLISH);
        display.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(display.format(parsed));
    }
}
Tue Aug 16, 2022 10:30:10 UTC

Der Parser liest den Ausgangstext ein. Der zweite Formatierer wählt ein gut lesbares Ausgabeformat und eine ausdrücklich festgelegte Anzeigezeitzone.