S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

DateTimeFormatterを使ってみた

Java8以降はスレッドセーフなのもあって、DateTimeFormatter使うのが良さげ。

オプションの入れ子

パターン文字を[]で括るとオプションにできるみたいなので、入れ子にできるか調べてみた。
年月日のパターンをオプションにして、時分秒ミリ秒を入れ子のオプションにしてみた。

System.out.println(DateTimeFormatter.ofPattern("[yyyy-MM-dd][yyyy/MM/dd][yyyyMMdd]").parse("2021/07/05"));
System.out.println(DateTimeFormatter.ofPattern("[yyyy-MM-dd][yyyy/MM/dd][yyyyMMdd]").parse("2021-07-06"));
System.out.println(DateTimeFormatter.ofPattern("[yyyy-MM-dd][yyyy/MM/dd][yyyyMMdd]").parse("20210707"));
System.out.println(DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS]]]]").parse("2021/07/05 23"));
System.out.println(DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS]]]]").parse("2021/07/05 23:16"));
System.out.println(DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS]]]]").parse("2021/07/05 23:16:01"));
System.out.println(DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS]]]]").parse("2021/07/05 23:16:01.020"));


結果は、ちゃんと入れ子にできるみたい。

{},ISO resolved to 2021-07-05
{},ISO resolved to 2021-07-06
{},ISO resolved to 2021-07-07
{},ISO resolved to 2021-07-05T23:00
{},ISO resolved to 2021-07-05T23:16
{},ISO resolved to 2021-07-05T23:16:01
{},ISO resolved to 2021-07-05T23:16:01.020

念のためSimpleDateFormatでオプション使えるか調べてみたけど、やはり対応していない。

オプションの入れ子にはセパレータが必要

セパレータ無しの年月日をパースすると、年月("202107")と年月日("20210708")でDateTimeParseExceptionになる。

DateTimeFormatter.ofPattern("[yyyy[MM[dd]]]").parse("2021")
DateTimeFormatter.ofPattern("[yyyy[MM[dd]]]").parse("202107")
DateTimeFormatter.ofPattern("[yyyy[MM[dd]]]").parse("20210708")


上記の時分秒ミリ秒と同様に、セパレータ("/")があると問題なくパースできる。

DateTimeFormatter.ofPattern("[yyyy[/MM[/dd]]]").parse("2021")
DateTimeFormatter.ofPattern("[yyyy[/MM[/dd]]]").parse("2021/07")
DateTimeFormatter.ofPattern("[yyyy[/MM[/dd]]]").parse("2021/07/08")


もしセパレータ無しの年月日をオプションでパースする場合は、年、年月、年月日をオプションとして指定する必要がある。

DateTimeFormatter.ofPattern("[yyyy][yyyyMM][yyyyMMdd]").parse("2021")
DateTimeFormatter.ofPattern("[yyyy][yyyyMM][yyyyMMdd]").parse("202107")
DateTimeFormatter.ofPattern("[yyyy][yyyyMM][yyyyMMdd]").parse("20210708")

ミリ秒とナノ秒のパターン文字の扱い

[.SSS]と[.nnnnnnnnn]のオプションを同時に指定すると、DateTimeParseExceptionになる。

DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS][.nnnnnnnnn]]]]").parse("2021/07/05 23:16:01.020123400")


秒とミリ秒のセパレータを、異なるセパレータすると同時に指定できた(ナノ秒のセパレータをカンマに変更)。

DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS][,nnnnnnnnn]]]]").parse("2021/07/05 23:16:01,020123400")

ナノ秒のパターン文字でのミリ秒とマイクロ秒の扱い

ナノ秒の指定で、3桁あるいは6桁を指定しても、ミリ秒あるいはマイクロ秒としてパースされず、ナノ秒の値としてパースされる。

DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS][,nnn]]]]").parse("2021/07/05 23:16:01,020")
DateTimeFormatter.ofPattern("yyyy/MM/dd[ HH[:mm[:ss[.SSS][,nnnnnn]]]]").parse("2021/07/05 23:16:01,020234")
{},ISO resolved to 2021-07-05T23:16:01.000000020
{},ISO resolved to 2021-07-05T23:16:01.000020123