web-dev-qa-db-fra.com

ISO 8601 en millisecondes et adaptation ultérieure

Je ne peux pas définir correctement le format de la date lorsque j'utilise la modification et que je tente de lire une date comme celle-ci:

2015-08-29T11:22:09.815479Z

Un GSON convertisseur que je suis en train de paramétrer est comme ceci:

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

Des indices sur quel est le problème?

8
Javier Manzano

Java Date a la précision milliseconde, donc j'ai créé l'objet Gson comme suit:

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

Bien sûr, dans un cas comme celui-ci, les microsecondes sont tronquées, que vous mettiez SSS ou SSSSSS. Il est également supposé que le dernier caractère de la chaîne convertie est toujours un Z.

Pour expliquer pourquoi votre modèle n'a pas fonctionné, vous avez utilisé z (minuscule z) qui, selon la documentation, représente un fuseau horaire général (c'est-à-dire Pacific Standard Time; PST; GMT-08:00). De plus, si vous utilisiez Z (majuscule Z), cela ne fonctionnerait pas non plus car il représente un fuseau horaire RFC 822 (c'est-à-dire -0800).

Dans un autre scénario où, au lieu de Z, vous avez un décalage de fuseau horaire (à savoir -08, -0800 ou -08:00), vous pouvez utiliser X, XX ou XXX pour représenter un ISO 8610 fuseau horaire . Mais cela nécessite Java 7 ou 8 (je ne pense pas qu'Android soit compatible avec Java 8 pour le moment).


Une autre méthode consiste à écrire votre propre variable GsonSerializer and Deserializer ; bien que je n'ai pas essayé.

Cela vaut également la peine de regarder Java.sql.Timestamp class qui est également pris en charge par Gson et a une précision plus fine (nanosecondes), mais c’est aussi une option que je n’ai pas explorée.

6
grim

Java 8 Instant class peut être utilisé pour facilement analyser ISO-8601 timestamps sans définir explicitement une chaîne de format, par exemple:

String input = "2018-11-07T00:25:00.073876Z";
Instant instant = Instant.parse(input);
0
AmitW