厳格な日付読み取りで良い方法は。。

存在しない日付の読み取り

String strdate = "20230931";
LocalDate dt = LocalDate.parse(strdate, DateTimeFormatter.ofPattern("yyyyMMdd"));
2023-09-30

まあ、これは想定される好ましくない方法
DateTimeFormatter に、ResolverStyle.LENIENT を指定すると

String strdate = "20230931";
LocalDate dt = LocalDate.parse(strdate, DateTimeFormatter.ofPattern("yyyyMMdd")
               .withResolverStyle(ResolverStyle.LENIENT));
2023-10-01

DateTimeFormatter に、ResolverStyle.STRICT を指定すると

String strdate = "20230931";
LocalDate dt = LocalDate.parse(strdate, DateTimeFormatter.ofPattern("yyyyMMdd")
               .withResolverStyle(ResolverStyle.STRICT));

java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor:
{YearOfEra=2023, DayOfMonth=31, MonthOfYear=9},ISO of type java.time.format.Parsed

年を yyyy ではなくて、uuuu を指定すると、、

String strdate = "20230931";
LocalDate dt = LocalDate.parse(strdate, DateTimeFormatter.ofPattern("uuuuMMdd")
               .withResolverStyle(ResolverStyle.STRICT));

java.time.DateTimeException: Invalid date 'SEPTEMBER 31'

LocalDate.parse(strdate, DateTimeFormatter.ofPattern("yyyyMMdd")
.withResolverStyle(ResolverStyle.STRICT));
でもいいじゃないかと思ってしまうが、それはダメで、
正常な日付、String strdate = "20230930"; で、ResolverStyle.STRICT を指定すると
java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor:
{YearOfEra=2023, DayOfMonth=30, MonthOfYear=9},ISO of type java.time.format.Parsed
になってしまう。

やはり、
  DateTimeFormatter.ofPattern("uuuuMMdd").withResolverStyle(ResolverStyle.STRICT)
を使うべきなのだと。。。

そして、30日、31日を指定した 2月30日、2月31日は、ResolverStyle.SMART なら、
2月28日、閏年なら、2月29日に補正してくれる。

以下、DateFormatter を直接使うことは少ないかな?

LocalDate dt = DateTimeFormatter.ofPattern("uuuuMMdd")
              .withResolverStyle(ResolverStyle.STRICT)
              .parse("20221001", LocalDate::from);
String res = DateTimeFormatter.ofPattern("uuuuMMdd")
            .withResolverStyle(ResolverStyle.STRICT)
            .toFormat()
            .format(dt);