it-swarm.com.ru

ISO 8601 с миллисекундами и дооснащением

Я не могу правильно установить формат даты, когда использую модификацию и пытаюсь прочитать дату следующим образом:

2015-08-29T11:22:09.815479Z

Конвертер GSON , который я устанавливаю, выглядит так:

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

Любые подсказки в чем проблема?

8
Javier Manzano

Java Date имеет точность в миллисекунды, поэтому я создаю объект Gson примерно так:

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

Конечно, в таком случае микросекунды усекаются независимо от того, введете ли вы SSS или SSSSSS. Также предполагается, что последний символ преобразованной строки всегда является Z.

Чтобы объяснить, почему ваш шаблон не работал, вы использовали z (нижний регистр z), который в соответствии с документацией представляет собой Общий часовой пояс (т.е. Pacific Standard Time; PST; GMT-08:00). Кроме того, если бы вы использовали Z (верхний регистр Z), это также не сработало бы, поскольку оно представляет часовой пояс RFC 822 (т.е. -0800).

В другом сценарии, где вместо Z имеется смещение часового пояса (т.е. -08, -0800 или -08:00), вы можете использовать X, XX или XXX для представления часового пояса ISO 8610 . Но для этого требуется Java 7 или 8 (на данный момент я не думаю, что Android совместим с Java 8).


Другой способ - написать свой собственный GsonSerializer and Deserializer ; хотя я не пробовал.

Также стоит взглянуть на Java.sql.Timestamp class, который также поддерживается Gson и имеет более мелкую точность (наносекунды), но это также опция, которую я не исследовал.

6
grim

Java 8 Instant class можно использовать для простого анализа ISO-8601 timestamps без явной установки строки формата, например:

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