it-swarm.com.de

java.text.ParseException: Nicht analysierbares Datum

Ich analysiere Ausnahme, während ich versuche, Code zu folgen

    String date="Sat Jun 01 12:53:10 IST 2013";
    SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
    Date currentdate;
    currentdate=sdf.parse(date);
    System.out.println(currentdate);

Ausnahme

Exception in thread "main" Java.text.ParseException: Unparseable date: "Sat Jun 01 12:53:10 IST 2013"
at com.ibm.icu.text.DateFormat.parse(DateFormat.Java:510)

eingabe: Sat Jun 01 12:53:10 IST 2013

Erwartete Ausgabe: Jun 01,2013 12:53:10

Wie kann man das lösen?

40
Ami

Ihr Muster entspricht überhaupt nicht der Eingabezeichenfolge ... Es ist nicht überraschend, dass es nicht funktioniert. Das würde wahrscheinlich besser funktionieren:

SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
                                            Locale.ENGLISH);

Um dann mit Ihrem gewünschten Format zu drucken, benötigen Sie ein zweites SimpleDateFormat:

Date parsedDate = sdf.parse(date);
SimpleDateFormat print = new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
System.out.println(print.format(parsedDate));

Anmerkungen:

  • sie sollten das Gebietsschema angeben, als ob das Gebietsschema nicht Englisch ist. Der Tagesname wird möglicherweise nicht erkannt
  • IST ist mehrdeutig und kann zu Problemen führen Sie sollten daher in Ihrer Eingabe möglichst den richtigen Zeitzonennamen verwenden.
90
assylias
        String date="Sat Jun 01 12:53:10 IST 2013";
        SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
        Date currentdate=sdf.parse(date);
        SimpleDateFormat sdf2=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss");
        System.out.println(sdf2.format(currentdate));

Muster ist falsch 

    String date="Sat Jun 01 12:53:10 IST 2013";
    SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
    Date currentdate;
    currentdate=sdf.parse(date);
    System.out.println(currentdate);
3
Suresh Atta
  • Ihr Formatierungsmuster stimmt nicht mit der Eingabezeichenfolge überein, wie in anderen Antworten angegeben.
  • Ihr Eingabeformat ist schrecklich.
  • Sie verwenden lästige alte Datum-Uhrzeit-Klassen, die vor Jahren durch die Klassen Java.time ersetzt wurden.

ISO 8601

Verwenden Sie stattdessen ein Format wie Ihres ISO 8601 Standardformate, um Datums- und Uhrzeitwerte als Text auszutauschen.

Die Java.time Klassen verwenden beim Parsen/Generieren von Strings standardmäßig die ISO 8601-Standardformate.

Richtiger Name der Zeitzone

Geben Sie ein richtiger Zeitzonenname im Format continent/region An, z. B. America/Montreal , Africa/Casablanca oder Pacific/Auckland. Verwenden Sie niemals die Abkürzung mit 3-4 Buchstaben wie EST oder IST, da diese nicht echte Zeitzonen sind, nicht standardisiert und nicht einmalig (!) .

Ihr IST könnte Islandische Normalzeit, Indienische Normalzeit, Irlandische Normalzeit oder andere bedeuten . Die Klassen Java.time müssen nur raten, da es keine logische Lösung für diese Mehrdeutigkeit gibt.

Java.time

Der moderne Ansatz verwendet die Klassen Java.time.

Definieren Sie ein Formatierungsmuster, das Ihren Eingabezeichenfolgen entspricht.

String input = "Sat Jun 01 12:53:10 IST 2013";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

zdt.toString (): 2013-06-01T12: 53: 10Z [Atlantic/Reykjavik]

Wenn Ihre Eingabe nicht für Island bestimmt war, sollten Sie die Zeichenfolge vorbereiten, um sie an einen richtigen Zeitzonennamen anzupassen. Wenn Sie beispielsweise sicher sind, dass die Eingabe für Indien bestimmt war, ändern Sie IST in Asia/Kolkata.

String input = "Sat Jun 01 12:53:10 IST 2013".replace( "IST" , "Asia/Kolkata" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

zdt.toString (): 2013-06-01T12: 53: 10 + 05: 30 [Asia/Kolkata]


About Java.time

Das Java.time Framework ist in Java 8 und höher. Diese Klassen ersetzen das lästige alte Legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration in die Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 31 .

Sie können Java.time Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber , der JDBC 4.2 oder höher entspricht. Keine Notwendigkeit für Zeichenketten, keine Notwendigkeit für Klassen Java.sql.*.

Woher bekommen Sie die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

2
Basil Bourque

Ich habe eine einfache Lösung gefunden, um das aktuelle Datum ohne Analysefehler zu erhalten.

Calendar calendar;
calendar = Calendar.getInstance();
String customDate = "" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH);
1
Anand Savjani

Aktualisieren Sie Ihr Format auf:

SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
1
Juned Ahsan
String date="Sat Jun 01 12:53:10 IST 2013";

SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");

Dieses Muster stimmt nicht mit mit Ihrem Eingabe-String überein, bei dem die Ausnahme auftritt.

Sie müssen folgendes pattern verwenden, um die Arbeit zu erledigen.

E MMM dd HH:mm:ss z yyyy

Der folgende Code hilft Ihnen dabei, die Ausnahme zu überspringen .

SimpleDateFormat wird verwendet .

    String date="Sat Jun 01 12:53:10 IST 2013"; // Input String

    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); // Existing Pattern

    Date currentdate=simpleDateFormat.parse(date); // Returns Date Format,

    SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss"); // New Pattern

    System.out.println(simpleDateFormat1.format(currentdate)); // Format given String to new pattern

    // outputs: Jun 01,2013 12:53:10
0
Dulith De Costa

Überprüfen Sie Ihr Muster (TT-MMM-JJJJ) und die Eingabe für die Analysemethode ("29-11-2018"). Die Eingabe für die Analysemethode sollte wie folgt erfolgen: TT-MMM-JJJJ i, e. 21-AUG-2019

In meinem Code:

String pattern = "DD-MMM-YYYY";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

    try {
        startDate = simpleDateFormat.parse("29-11-2018");// here no pattern match 
        endDate = simpleDateFormat.parse("28-AUG-2019");// Ok 
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
0
Avinash Khadsan