DateFormatの落とし穴

DateFormat df = DateFormat.getDateInstance();
Date dt = df.parse(“2382/12/31”);

このソースコード。

環境に拠っては異常終了します。

たとえばロケール。

Locale loc = Locale.getDefault(); // 現在のロケール
System.out.println(“Locale = ” + loc.toString());
System.out.println(“Country = ” + loc.getCountry());
System.out.println(“Display Country = ” + loc.getDisplayCountry());
System.out.println(“Language = ” + loc.getLanguage());
System.out.println(“Display Language = ” + loc.getDisplayLanguage());

たとえばこんなコードを実行して、
Locale = ja_JP
Country = JP
Display Country = 日本
Language = ja
Display Language = 日本語

という環境であれば

DateFormat df = DateFormat.getDateInstance();
System.out.println(df.format(new Date()));

を実行した場合
【2018/11/22】
と出力される。

でも
Locale = en_US
Country = US
Display Country = United States
Language = en
Display Language = English
の環境の場合、
【Nov 22, 2018】
と出力される。

Locale = en_US
の環境の場合、
DateFormat df = DateFormat.getDateInstance();
Date dt = df.parse(“2382/12/31”);

ParseExceptionになります。

その場合、上記のフォーマットに影響されない
Date tmpDate = new SimpleDateFormat(“yyyyMMdd”).parse(“23821231”);
とかをつかったほうが安全です。

コメント

タイトルとURLをコピーしました