web-dev-qa-db-ja.com

ミリ秒とレトロフィットを備えた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()
);

問題の手がかりはありますか?

10
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)、XXX、またはXXXを使用して ISO 8610タイムゾーン を表すことができます。しかし、これにはJava 7または8が必要です(AndroidはJava 8と現時点では互換性がないと思います。


別の方法は、独自のGsonSerializer and Deserializer ;を記述することです。私は試していませんが。

これも一見の価値があります Java.sql.TimestampGsonでもサポートされ、より細かい精度(ナノ秒)を持つクラスですが、これまでに調べたことのないオプションでもあります。

7
grim

Java 8 Instant クラスを使用すると、フォーマット文字列を明示的に設定しなくても ISO-8601 タイムスタンプを簡単に解析できます。次に例を示します。

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