DateFormat das Muster “yyyy-MM-dd NICHT'HH:mm:ss.SSS 'Z'" in Gson
Habe ich zwei Felder, wie unten (achten, dass das erste Feld hat Millisekunden Abschnitt):
{
"updateTime":"2011-11-02T02:50:12.208Z",
"deliverTime":"1899-12-31T16:00:00Z"
}
Möchte ich Deserialisieren, die Json-string in ein Objekt mit Gson, so bekomme ich eine Gson
Beispiel:
GsonBuilder gb = new GsonBuilder();
gb.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
gson = gb.create();
Dem ersten Feld deserialisiert, um Java-Typ date: 2011-11-02 02:50:12.208 (sieht aus wie ignoriert Zeitzone " - "Z", das ich erwartet hatte). Jedoch, das zweite Feld ist deserialisiert, um 1900-01-01 00:00:00 (ich Lebe in China, +8 GMT hier), scheint es, dass die Zeitzone " - " Z " - spielt eine Rolle bei der Deserialisierung.
Warum das zweite Feld verwendet Zeitzone"? Es ist nicht das, was ich erwartet hatte.
- Für mich ist es nicht zu analysieren, das zweite Datum string (
java.text.ParseException: Unparseable date: "1899-12-31T16:00:00Z"
). welche version von Gson verwenden Sie? - Warum tun Sie umschließen, T und Z in einfachen Anführungszeichen " ? Ich nicht (gson 1.7.1)
- Nur, um Ihnen morefeedback, mein Muster MM/TT/JJ HH:mm:ss-SSSZ gibt mir ein Datum wie dieses : 02/20/13 18:03:11 089+0100
- Zu Clemens, sorry das ich erst so spät Antworte . Ich bin mit gson 2.2.2.
- Samuel, der Ergebnis-string erzeugt wurde, in irgendwo, dass ich keine Kontrolle über das format. Ich hatte versucht, löschen Sie die Anführungszeichen, gson würde geworfen, ein unbekanntes Zeichen Ausnahme. Was ich Frage ist der Unterschied von konvertieren Verhalten(eine ingore Zeit-zone, während andere würde nicht), wenn Millisekunden Feld vorhanden ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schnelle Antwort
Erste string wird korrekt geparst mit Ihrem Datum-format und Ihre lokale Zeitzone, das zweite nicht respektieren, so wird analysiert, indem eine Standard -
SimpleDateFormat
Objekt, nicht Millisekunden ("yyyy-MM-dd NICHT'HH:mm:ss 'Z' ist der parsing-format) und benutzt UTC-Zeitzone geben Sie ein "shift" in der Zeit Teil.Ausführliche Antwort
Vollständig auf Ihre Frage Antworten, die Sie brauchen, um zu Tauchen in Gson-source-code. Insbesondere haben Sie Blick auf code von
DefaultDateTypeAdapter
zum analysieren von Daten. Sie finden diesen code auf link, aber für eine schnelle Referenz, die ich kopieren hier die meisten relevanten Teile.Beim aufrufen dieser in den generator:
sind Sie initialisieren eines DefaultDateTypeAdapter in dieser Weise:
wo:
enUsFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
undlocalFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US)
da die Zeichenfolge, die Sie bestanden haben, in den generator.
Achten, dass
Locale.US
ist nicht eine Zeitzone und, dassiso8601Format
ist das gleiche wieenUsFormat
ohne Millisekunden, aber mit der UTC-Zeitzone.Parsen geschieht in
deserializeToDate
Methode:wo alle drei Datums-Formate werden verwendet, in einem Wasserfall-Ansatz.
Erste Json-string: "2011-11-02T02:50:12.208 Z". Es analysiert sofort von
localFormat
da hat Millisekunden und gibt Ihnen das Ergebnis, die Sie erwarten, verwenden Sie Ihre Zeitzone.Zweiten Json-string: "1899-12-31T16:00:00Z". Es wird nicht analysiert werden, indem
localFormat
da nicht Millisekunden, also zweite chance ist enUsFormat das ist die gleichen Muster, außer für das Gebietsschema. So wird es nicht in der gleichen Weise.Letzte chance, zu analysieren:
iso8601Format
es wird, es hat keine Millisekunde, ABER, für den Bau, als auch der UTC-Zeitzone, also wird es geparst Datum als UTC, während die anderen analysierten mit Ihrer Zeitzone.