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