ISO8601形式のSimpleDateFormat指定について

Javaにて、日時をISO8601形式にする際のSimpleDateFormat指定を間違えたせいで
パース処理が例外で落ちるようになっていたというお話。

// こんな感じで保持したデータを……
SimpleDateFormat sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZ", Locale.JAPAN);
String timeString = sdf.format(date);
// 別の所でパースしようとしたらフォーマットエラーが出る
Time time = new Time();
time.parse3339(timeString); // Exception!

“2017-09-27T13:00:00.000+09:00” という文字列がほしいのに、コロンが抜けて
“2017-09-27T13:00:00.000+0900” になっているのが例外の原因。

これは日付フォーマットの指定を間違えているせい。
タイムゾーン指定は ZZ ではなく XXX にしないとダメ。

ZのほうのタイムゾーンはRFC822形式、Xが目当てのISO8601形式とのこと。
そのへんのしょっぱい解説サイトだと混同されてる感があるので注意

参考:

スポンサーリンク
レクタングル(大)
レクタングル(大)
スポンサーリンク
レクタングル(大)