java.util.Calendar と TimeZone と java.text.SimpleDateFormat

日本時間の 2011年4月12日 13時50分 (JST) を UTC (Universal Time, Coordinated) に変換して,Tue Apr 12 04:50:00 +0000 2011 (UST) の形で表現する.

import java.io.*;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.TimeZone;
import java.text.SimpleDateFormat;
import java.util.Locale;

public class CalendarTimeZone {
    static void printCalendar(Calendar cal){
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH)+1;
        int date = cal.get(Calendar.DATE);

        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int minute = cal.get(Calendar.MINUTE);
        int second = cal.get(Calendar.SECOND);

	String tz = cal.getTimeZone().getDisplayName(Locale.US);

        System.out.println(year + "年" + month + "月" + date + "日" + hour + "時" + minute + "分" + second + "秒" + "(" + tz + ")");
    }

    static Calendar makeCalendar(int year, int month, int date,
				 int hour, int minute, int second){
	Calendar cal = new GregorianCalendar(year, month-1, date, hour,
					     minute, second);
	return cal;
    }

    //(注意)文字列に変換する際,TimeZone を指定していることに注意
    static String Cal2String(Calendar cal, TimeZone tz){

	SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.US);
	sdf.setTimeZone(tz);
	String calString = sdf.format(cal.getTime());

	return calString;
    }

    public static void main(String[] args){

	//2011年4月12日 13時50分 (JST)
	Calendar cal = makeCalendar(2011, 4, 12, 13, 50, 0);
	printCalendar(cal);

	//カレンダを "Tue Apr 12 04:50:00 +0000 2011" の文字列形式に変換
	String calString = Cal2String(cal,
				      TimeZone.getTimeZone("UTC"));
	System.out.println(calString);
    }
}

Calendar にセットした時間を単純に表示すると日本時間.一方,java.text.SimpleDateFormat にて setTimeZone() することで UCT の文字列形式が得られる.

2011年4月12日13時50分0秒(Japan Standard Time)
Tue Apr 12 04:50:00 +0000 2011

ちなみに,TimeZone を変更した Calendar を保持するだけならば,以下のコードでもよいが,UCT の文字列にしたいという目的ならば上記のコードの方が楽.

Calendar JST2UTC(Calendar jstCal){
    long millis = jstCal.getTimeInMillis();
    Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    utcCal.setTimeInMillis(millis);

    return utcCal;
}

参考:以下のサイトにおいて UTC と GMT の違いが説明されている.
http://www.localtime.jp/utc-gmt/