2017-05-02 2 views
2

Ich versuche, dies in ein lesbares Format jedoch zu konvertieren, halten java.text.ParseException: Unparseable date: "2016-11-18T11:13:43.838Z" (at offset 23)So lösen Sie java.text.ParseException: Unauffälliges Datum?

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US); 
try { 
    Date date1 = df.parse("2016-11-18T11:13:43.838Z"); 

    DateFormat outputFormatter1 = new SimpleDateFormat("dd-MMM-yyyy"); 
    String output1 = outputFormatter1.format(date1); // 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

ich über das Hinzufügen vorgeschlagen locale als andere SO Antworten lesen bekommen, aber es funktioniert immer noch nicht.

+0

Setzen Sie das Z in einfache Anführungszeichen in Ihrem 'SimpleDateFormat'. So: 'DateFormat df = neues SimpleDateFormat (" yyyy-MM-dd'T'HH: mm: ss.SSS'Z '");' –

+0

fehlt dir die Zeitzone .... –

+1

@ ΦXocê 웃 Пepeúpa ツ Er hat eine Zeitzone. 'Z' ist die Nullzeitzone, äquivalent zu' + 0000'. –

Antwort

2

Sie einen String parsen, die keine korrekte Darstellung dieses Musters ist, können Sie die Time-Zone fehlen ... so etwas wie: -0600

Beispiel:

Date date1 = df.parse("2016-11-18T11:13:43.838-0600Z"); 

hier ist die doc für weitere Informationen ....

Ihr Code sollte wie folgt aussehen:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    try { 
     Date date1 = df.parse("2016-11-18T11:13:43.838-0600Z"); 
     DateFormat outputFormatter1 = new SimpleDateFormat("dd-MMM-yyyy"); 
     String output1 = outputFormatter1.format(date1); // 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
+0

Dies ist das einzige, was hat funktioniert. Die Lösung bestand darin, zu ändern, wie das Back-End-Datum speichert, damit ich es mit SimpleDateFormat für zulässige Muster formatieren kann. Es sei denn, jemand kann eine Lösung anbieten, ohne den Wert des vom api-Aufruf zurückgegebenen Datums zu ändern. Ich denke, das ist die beste Antwort. – Woppi

+0

@Woppi -0600 ist nicht dasselbe wie Z (= + 0000). Wenn Sie die Eingabe also über die String-Vorverarbeitung ändern, erhalten Sie ein anderes Ergebnis. Wenn Ihre JVM zu alt ist (vor Java-7 keine Unterstützung für X-Muster), sollten Sie stattdessen "Z" durch "+0000" (oder sogar "+00: 00") ersetzen. –

3

Entsprechend der docs die Z in Ihrem Format String zeigt eine RFC 822-Zeitzone, z. +01: 00. Sie müssen eine ISO 8601-Zeitzone parsen (die Z in Ihrer Eingabezeichenfolge, die die UTC-Zeitzone angibt). Sie konfigurieren, dass mit X:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US); 
+0

Hallo, ich habe versucht X, aber "java.lang.IllegalArgumentException: Unbekannte Musterzeichen 'X' bei java.text.SimpleDateFormat.validatePatternCharacter (SimpleDateFormat.java:314)". BTW, ich benutze dies in Android App und ich erkenne nur das Muster auf unserem mongodb gespeichert wird nicht in android https://developer.android.com/reference/java/text/SimpleDateFormat.html – Woppi

2

die Javadoc für SimpleDateFormat Lesen, fand ich, dass Z für Zeitzone mit sehr streng ist. Es erkennt "Z" nicht als Zulu, es akzeptiert nur numerische Zeitzonen-Offsets. Sie könnten stattdessen versuchen X, die "Z" gemäß der Dokumentation akzeptieren.

Verwandte Themen