SimpleDateFormatのLocaleとタイムゾーンのメモ

Localeを指定するとタイムゾーンが変わるかと思っていたが実際は変わらなかったのでメモ

Localeを設定した時の挙動

以下のコードを3つのLocaleで実行してみた

Date date = new Date(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MMMMM.dd GGG hh:mm aaa", locale);
Log.d(TAG, "format: " + sdf.format(date));

結果は以下のような出力になる

Locale 出力
JAPAN 2016.12.08 西暦 12:07 午前
CHINA 2016.12.08 公元 12:07 上午
US 2016.D.08 AD 12:07 AM

Localeを変えてもすべて12時7分になっていた
Localeの指定では午前やAMなどの表記が異なるようだ
よく考えるとアメリカ国内でも地域によって時差が違っているのにUSのみなのはおかしい・・・

TimeZoneを設定する

実際にタイムゾーンを考慮してフォーマットするためには
DateFormat#setTimeZone(TimeZone)を使えば良い

例:東京とニューヨークの例

sdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
Log.d(TAG, "format: " + sdf.format(date));
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Log.d(TAG, "format: " + sdf.format(date));

結果は以下の通り

format: 2016.12.08 西暦 00:57 午前
format: 2016.12.07 西暦 10:57 午後