2015-08-29 5 views
6

ich nicht richtig das Datumsformat einstellen, wenn Nachrüstung mit und versuche, ein Datum wie folgt zu lesen:ISO 8601 mit Millisekunden und Retrofit

2015-08-29T11:22:09.815479Z 

An dem GSON Konverter I Einstellung ist, ist wie folgt:

GsonConverter gsonConverter = new GsonConverter(
    new GsonBuilder() 
      .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSz") 
      .create() 
); 

Irgendwelche Hinweise auf was ist das Problem?

+0

Verwenden Sie die Klassen in [java.time framework] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html), die in Java 8 und höher integriert sind. Sie haben eine Auflösung von Nanosekunden für bis zu neun Ziffern einer Bruchteilsekunde. –

Antwort

5

Java Date hat millisekundengenau so habe ich die Gson Objekt wie so die Schaffung worden: in einem Fall wie diesem

Gson gson = new GsonBuilder() 
     .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") 
     .create(); 

Natürlich, die Mikrosekunden verkürzt werden, ob Sie SSS oder SSSSSS setzen. Es wird auch angenommen, dass das letzte Zeichen der konvertierten Zeichenfolge immer ein Z ist.

Um zu erklären, warum Ihr Muster, verwendet man nicht funktionierte z (Klein z), die entsprechend der Dokumentation stellt eine General Timezone (das heißt Pacific Standard Time; PST; GMT-08:00). Außerdem, wenn Sie Z (Großbuchstabe Z) verwenden würden, würde es auch nicht funktionieren, da es eine RFC 822 time zone (d. H. -0800) darstellt.

In einem anderen Szenario, in dem anstelle der Z Sie eine Zeitzone (das heißt -08, -0800 oder -08:00) versetzt haben, können Sie X, XX oder XXX verwenden, um eine ISO 8610 time zone darzustellen. Aber das erfordert Java 7 oder 8 (ich glaube nicht, dass Android im Moment mit Java 8 kompatibel ist).


Eine andere Methode wäre, um Ihre eigenen zu schreiben GsonSerializer and Deserializer; obwohl ich es nicht versucht habe.

Es lohnt mich auch bei java.sql.Timestamp der Klasse zu suchen, die auch von Gson getragen wird und mehr feinkörnige Präzision (Nanosekunden), aber es ist auch eine Option, ich habe nicht untersucht.

+0

Ein großer Teil der java.time-Funktionalität, die in Java 8 und höher integriert ist, wird in [ThreeTen-Backport] (http://www.threeten.org/threetenbp/) zurück zu Java 6 & 7 portiert und weiter an [Android] angepasst. (https://en.wikipedia.org/wiki/Android_(operating_system)) in [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP) (siehe [* Wie benutzt man ... *] (http: // stackoverflow.com/q/38922754/642706)). –

+0

Ist das wirklich ISO 8601 kompatibel? Ich habe Millis noch nie in der offiziellen Spezifikation gesehen. Dies sieht wie eine Erweiterung des Standardformats aus. –