S_a_k_Uの日記みたいなDB

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

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した値)も値が格納されいた。