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