0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Javaで和暦から西暦へ変換する時は、Locale.JAPANを指定しよう

Posted at

はじめに

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);
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?