DateTimeFormatterを使用して日付文字列をLocalDateTimeに変換する方法

IT, Java

ケース1:失敗例(”20200229T0925″のような日付文字列を変換したい)

上記コードの実行結果は
「java.time.format.DateTimeParseException: Text ‘20200229T0925’ could not be parsed at index 0」
という例外がスローされます。
LocalDateTime.parseメソッドの中で使用されているDateTimeFormatterは「ISO_LOCAL_DATE_TIME」なので「yyyy-MM-ddThh:mm:ss」形式以外の日付文字列は LocalDateTime に変換できません。

ケース1:成功例(”20200229T0925″のような日付文字列を変換したい)

上記コードの動作結果は「2020-02-29T09:25」
日付 文字列がLocalDateTimeに変換され、出力されます。

DateTimeFormatter.ofPatternの引数について解説しておきます。
yyyyは西暦
MMは月
ddは日
‘T’はただの文字。パターン内に特殊な意味を持たない文字を埋め込むためにはシングルクォーテーションで囲えばよさそう
HHは時間
mmは分。
[ss]は秒。 []で囲うとあってもなくても動作する。 日付文字列に秒まで記載されているケースにも対応するために付けている。

今回作成したformatterでは
「20200229T0925」のような【年月日T時分】日付文字列
「20200229T092513」のような【年月日T時分秒】日付文字列を変換できます。

ケース2:失敗例(日付文字列に複数パターンあり)

変換したい日付文字列に複数のパターンがある場合を想定します。
【年月日T時分】「yyyyMMddThhmm」
【年月日t時分秒】 「yyyyMMddthhmmss」
【年月日T時】 「yyyyMMddThh」
先程のformatterで変換できる実験します。

日付文字列に含まれる小文字のtなどには対応していないため、
例外がスローされます。

ケース2:成功例(日付文字列に複数パターンあり)

上記コードで変換できます。

DateTimeFormatterBuilderについて解説していきます。
名前の通り DateTimeFormatter を作成するクラスです。
.appendOptional(DateTimeFormatter hoge))
で複数のパターンをフォーマッターに追加できます。
似たようなメソッドに.append( DateTimeFormatter hoge )がありますが、
これだと機能しません。
appendOptionalは登録パターンのいずれかに合致すれば変換します。
appendは登録パターン全てに合致しないと変換しません。
appendOptional を使用しましょう。
appendOptional を使用して複数パターンを登録したら
.toFormatter()でフォーマッターに変換します。

ケース3:25時のような特殊日時の対応

TV番組表で見かける25時みたいな表記があります。
日付文字列「2011-12-03T25:15:30」を日付に変更する場合、
2011/12/04 01:15:30」という日付に変換したいわけです。

上記コードの動作結果は「2011-12-04T01:15:30」です。
無事、特殊 日時 を変更できました。

DateTimeFormatterの作成時に
.withResolverStyle(ResolverStyle.LENIENT);
ResolverStyle を変更しています。
ResolverStyle を LENIENT に変更することで、
32日や25時などの特殊日時をいい感じに変更してくれるようになります。
デフォルトだと ResolverStyle.SMART になるみたいです。
特殊日時 に対応したい場合、
ResolverStyle.LENIENT を使用してください。

IT, Java

Posted by raishin