JSR-310のDateTimeFormatterに気を付けろ

JSR-310に限った話ではないかもしれませんが。

JSR-310で日時なりを文字列にするときは、fomratメソッドにDateTimeFormatterクラスのインスタンスを渡してやる。んー分かりやすい。ちなみにtoStringメソッドでもOK。この場合はISO 8601の形式でフォーマットされます。

で、このtoStringメソッドで使われているフォーマッター(おそらくDateTimeFormatter.ISO_*として用意されている出来合いのフォーマッター)なんですが、気が利いています。どう気が利いているかと言うとミリ秒がゼロの場合はミリ秒を出力しない。き、気が利いてる〜。

けど、他の言語やライブラリがフォーマッターに厳密に従ってパースする場合はミリ秒があったりミリ秒がなかったりで非常に厳しいので、どちらかに統一した方がいいねという話です。というかそれだけの話でした。一応フォーマッターの定義だけ掲載しときます。

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

DateTimeFormatter alwaysWithoutMillis = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZZZZZ");

ZonedDateTime.of(2018, 4, 13, 18, 48, 21, 1000000, ZoneId.of("Asia/Tokyo")).format(alwaysWithoutMillis); // => 2018-04-13T18:48:21+09:00

DateTimeFormatter alwaysWithMillis = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ");

ZonedDateTime.of(2018, 4, 13, 18, 48, 21, 0, ZoneId.of("Asia/Tokyo")).format(alwaysWithMillis); // => 2018-04-13T18:48:21.000+09:00

Javaめっちゃ久し振りに書いた!