2012-03-26 8 views
3

Ich rufe einen Service an, der GMT-Daten zurückgibt. Es funktioniert gut seit November, aber jetzt mit Sommerzeit aktiv, es scheitert. Hier ist ein Beispiel Datum aus Nicht-Sommerzeit:Kann ich ein SimpleDateFormat-Muster für Daten mit den Suffixen "Z" und "+1: 00" verwenden?

2011-12-07T15:50:01Z 

Und man von heute (in der Sommerzeit):

2012-03-26T11:05:01+01:00 

Früher habe ich dieses Muster wurde unter Verwendung von:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.UK); 

Aber es ist am zweiten Datum oben mit einem ParseExcepton fehlgeschlagen ("Unparser Datum ..."). Also, kann ein Muster für beide verwendet werden, und wenn ja, was ist es? Wenn ich für beide kein Muster verwenden kann, welches ist das korrekte Muster für das zweite Datum?

Es sollte keinen Unterschied machen, aber wenn es das tut, wird es auf der Android-Plattform verwendet.

Antwort

2

Es macht definitiv einen Unterschied, dass Sie Android verwenden, da es einen Unterschied in diesem Fall machen würde, wenn Sie verwendet haben, Java 6.5 oder 7.

Das Muster Sie verwenden Gibt eine wörtliche ' Z '(auch' T ') analysiert werden. Es analysiert keine Zeitzone. Sie müssen die einfachen Anführungszeichen um das 'Z' löschen, um mit der Analyse einer tatsächlichen Zeitzone zu beginnen.

Laut der Android JavaDoc ist es unklar, ob ein Kapital Z auch in diesem Fall funktioniert, da das Format der Stunden/Minuten ziemlich spezifisch ist. Ich weiß nicht genug über das Android-SDK zu bestätigen, aber der Doppelpunkt macht definitiv einen Unterschied in Standard-Java.

+1

Dank Spencer, es keine einfache Antwort hätte wissen müssen, wäre! Ich habe versucht, die einfachen Anführungszeichen um das 'Z' zu löschen und es funktioniert nun am zweiten Datum (nach dem Entfernen des ':'), aber nicht am ersten. Sieht so aus, als müsste ich mit Bedacht auswählen, welches Datumsformat analysiert werden soll. –

+0

Nein, ersetzen Sie einfach 'Z' am Ende (wenn es existiert) mit' +01: 00', bevor Sie das Datum analysieren. 'Z' ist das Symbol für diesen Offset. – caw

2

Das neue Zeitzonenmuster ISO8601 wird durch den Musterbezeichner X abgedeckt, der in Java 7 eingeführt wird.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.UK); 

Wenn Sie noch auf Java 6 oder älter sind, dann ja kann es Unterschied machen. Sie müssen entweder (teilweise) selbst analysieren oder Joda Time greifen.

1

Falls Sie java6 verwenden, werden Sie die Muster identifizieren müssen und dann die formater gelten

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
    String date2Str="2011-12-07T15:50:01Z"; 
    Date date2 = df.parse(date2Str); 
    System.out.println(date2.toString()); 

    SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
    String date1Str="2012-03-26T11:05:01GMT+01:00"; 
    Date date1 = df2.parse(date1Str); 

    System.out.println(date1.toString());