はじめに
Javaで和暦を西暦に変換する方法を調べると、下記のようにDateTimeFormatter#ofPatternで、"GGGGy年"とすることで、和暦を解釈出来るコードが出てくる。
コード
public static LocalDate convertWarekiToSeireki(String strDate) {
// DateTimeFormatterオブジェクトを生成し、和暦のパターンを設定する
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("GGGGy年M月d日")
.withChronology(JapaneseChronology.INSTANCE)
.withResolverStyle(ResolverStyle.SMART);
// 和暦の文字列をLocalDateに変換する
JapaneseDate wareki = JapaneseDate.from(formatter.parse(strDate));
// JapaneseDateからLocalDateに変換する
return LocalDate.from(wareki);
}
とある案件で利用したが、ローカル環境では動いていたが、STG環境(クラウド環境)だとExceptionが発生した。
java.time.format.DateTimeParseException: Text '' could not be parsed at index 0
原因
フォーマッタはデフォルトのFORMATロケールを使用します。これを変更するには、返されたフォーマッタに対してwithLocale(Locale)を使用するか、このメソッドのバリアントであるofPattern(String, Locale)を使用します。
とあるように、Localeが正しくセットされていない事が原因。
解決方法
第2引数でLocale.Japanを指定するようにした。(withLocaleでも良いハズ)
public static LocalDate convertWarekiToSeireki(String strDate) {
// DateTimeFormatterオブジェクトを生成し、和暦のパターンを設定する
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("GGGGy年M月d日", Locale.JAPAN)
.withChronology(JapaneseChronology.INSTANCE)
.withResolverStyle(ResolverStyle.SMART);
// 和暦の文字列をLocalDateに変換する
JapaneseDate wareki = JapaneseDate.from(formatter.parse(strDate));
// JapaneseDateからLocalDateに変換する
return LocalDate.from(wareki);
}