ユーザ用ツール

サイト用ツール


java:calendar

カレンダーと日付

タイムゾーン指定フォーマット

CalendarからDateに変換する時にタイムゾーン情報は失われてしまうため、以下のようにUTCのCalendarをDateFormatでフォーマットしても日本国内のマシン(タイムゾーンが日本に設定してあるマシン)ではJSTの時刻でフォーマットされてしまいます。

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ssZZZ");
df.format(cal.getTime());

タイムゾーンを指定してフォーマットするにはDateFormat#setTimeZoneでタイムゾーンをセットする

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ssZZZ");
df.setTimeZone(cal.getTimeZone());
df.format(cal.getTime());

タイムゾーンの変換

デフォルトのタイムゾーンが日本時間に設定されている前提。

UTCタイムゾーンの時刻を取得する

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));

現在の日本時間の -9時間 の値が出力される。

日本時間の特定の日時をUTCに変換したい場合はやっかい。例えば2009年5月12 13時12分30秒(JST)に対応するUTCのインスタンスが欲しい場合。これはだめ。

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2009);
cal.set(Calendar.MONTH, 5);
cal.set(Calendar.DATE, 12);
cal.set(Calendar.HOUR_OF_DAY, 13);
cal.set(Calendar.MINUTE, 12);
cal.set(Calendar.SECOND, 30);
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));

セットした時点では内部に反映されない。最後の行でGETした時点で、日時の設定とタイムゾーンの設定が同時に行われ、最終的なCalendarの状態は2009年5月12 13時12分30秒(UTC)のインスタンスとなる。よって出力は13となる。

以下のようにする。

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2009);
cal.set(Calendar.MONTH, 5);
cal.set(Calendar.DATE, 12);
cal.set(Calendar.HOUR_OF_DAY, 13);
cal.set(Calendar.MINUTE, 12);
cal.set(Calendar.SECOND, 30);
System.out.println(cal.get(Calendar.HOUR_OF_DAY));  // セットした値が内部に反映される
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));

最初のgetをして始めてCalendarの状態が2009年5月12 13時12分30秒(JST)となる。タイムゾーンをUTCにセットして再度getすると2009年5月12 4時12分30秒(UTC)となる。よって最終出力は4となる。

タイムゾーン変換は以下のようにしたほうが分かりやすいかも

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));
cal.set(Calendar.YEAR, 2009);
cal.set(Calendar.MONTH, 5);
cal.set(Calendar.DATE, 12);
cal.set(Calendar.HOUR_OF_DAY, 13);
cal.set(Calendar.MINUTE, 12);
cal.set(Calendar.SECOND, 30);
long millis = cal.getTimeInMillis();
 
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.setTimeInMillis(millis);
System.out.println(cal.get(Calendar.HOUR_OF_DAY));    // 4
java/calendar.txt · 最終更新: 2009/12/25 03:01 by 127.0.0.1