はじめましてこんにちは!コンテンツ・メディア第1事業部の西川です。ピクトリンクというアプリのサーバサイドの開発をしています。 今日はJava8のDate and Time APIでハマった話をします。
ある文字列を日付型に変換したい…よくあると思います。

これを実行すると…DateTimeParseExceptionが。

ResolverStyleをSTRICT(厳密)にしているのでLENIENTかSMART(デフォルト)を指定すると動きます。

DateTimeFormatterのドキュメントを見ると

y year-of-era
u year

とあります。

eraは暦を表すのでSTRICTを指定した場合はどの暦かわからなくてエラーになっているということです。歴は日本で言うと平成、昭和などです。

単純に解決するには yyyyuuuu にすればOK。

どうしても yyyy を使いたい!という人は以下のように暦を指定させるようにする必要があります。

おまけ:SimpleDateFormatで判定を厳密にしたい場合

以下のように setLenient(false) でOKです。