2015-08-29 23 views
6

non riesco a impostare correttamente il formato della data quando si utilizza retrofit e cercando di leggere una data così:ISO 8601 con millisecondi e Retrofit

2015-08-29T11:22:09.815479Z 

Un convertitore GSON Sono impostazione è simile a questo:

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

Eventuali indizi su qual è il problema?

+0

Utilizzare le classi nel [framework java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) integrato in Java 8 e versioni successive. Hanno una risoluzione di nanosecondi per un massimo di nove cifre di un secondo frazionario. –

risposta

5

Java Date ha millisecondo precisione così mi è stato creato l'oggetto Gson in questo modo:

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

Naturalmente, in un caso come questo, i microsecondi vengono troncate se si mette SSS o SSSSSS. Si presume inoltre che l'ultimo carattere della stringa convertita sia sempre un Z.

a spiegare perché il vostro modello non ha funzionato, si è utilizzato z (z minuscola), che in base alla documentazione rappresenta un General Timezone (vale a dire Pacific Standard Time; PST; GMT-08:00). Inoltre, se si dovesse utilizzare Z (maiuscolo Z), non funzionerebbe anche in quanto rappresenta un (ad esempio -0800).

In un altro scenario in cui al posto del Z si dispone di una differenza di fuso orario (cioè -08, -0800 o -08:00), è possibile utilizzare X, XX, o XXX a rappresentare un ISO 8610 time zone. Ma ciò richiede Java 7 o 8 (non credo che Android sia compatibile con Java 8 al momento).


Un altro metodo sarebbe quello di scrivere il proprio GsonSerializer and Deserializer; anche se non ho provato

Vale anche la pena guardare la classe java.sql.Timestamp che è anche supportata da Gson e ha una precisione a grana fine (nanosecondi) ma è anche un'opzione che non ho esplorato.

+0

Gran parte della funzionalità java.time incorporata in Java 8 e versioni successive è back-porting su Java 6 e 7 in [ThreeTen-Backport] (http://www.threeten.org/threetenbp/) e ulteriormente adattata a [Android] (https://en.wikipedia.org/wiki/Android_(operating_system)) in [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP) (vedi [* Come usare ... *] (http: // stackoverflow.com/q/38922754/642706)). –

+0

È davvero compatibile con ISO 8601? Non ho mai visto millis nelle specifiche ufficiali. Sembra un'estensione del formato standard. –