TemporalAccessor#isSupportedの戻り値
DateTimeFormatterでパースすると、TemporalAccessorインターフェース(Parsedクラスのオブジェクト)でパースされた日時が戻ってくる。
isSupportedメソッドで、各フィールド(年月日時分秒ミリ秒マイクロ秒ナノ秒)の有無が検査できるか確認してみた。
すると、日付は年月日それぞれ判定できるが、時刻は時がある時点で分以下全てのフィールドが有となり、各フィールドの有無が判定できなかった。
日付
DateTimeFormatter.ofPattern("yyyy").parse("2021")
ChronoField.Year(年)のみtrue
DateTimeFormatter.ofPattern("yyyy/MM").parse("2021/07")
ChronoField.Year(年)とChronoField.MonthOfYear(月)がtrue
DateTimeFormatter.ofPattern("yyyy/MM/dd").parse("2021/07/05")
ChronoField.Year(年)とChronoField.MonthOfYear(月)とChronoField.DayOfMonth(日)がtrue
(他にも年月日が確定することで得られるフィールドがtrueになる)
時刻
DateTimeFormatter.ofPattern("yyyy/MM/dd HH").parse("2021/07/05 23")
パース元の文字列に時まで存在する時点で、時~ナノ秒までのフィールドがtrueになる。
Parsedクラスの動作
メンバ変数の持ち方を確認することで、ParsedクラスのisSupportedメソッドの動作は理解できた。
日付
年あるいは年月をパースした場合、メンバ変数のdate(LocalDate型)はnullで、filedValues(Map型)に年と月の値が格納されている。
月日をパースした場合も同様。
年月日が揃った時点で、dateに日付のオブジェクトが格納され、filedValuesには値が格納されいなかった。
時刻
時のみをパースした場合、メンバ変数のtime(LocalTime型)に時刻のオブジェクト(分以下0)が格納され、filedValuesには値が格納されいなかった。
分秒ミリ秒をパースした場合、timeにnullが格納され、filedValuesに値が格納されていた。
また、ミリ秒をパースした時点で、filedValuesにはマイクロ秒(x1,000した値)とナノ秒(x1,000,000した値)も値が格納されいた。