GMT時刻を任意のタイムゾーン時刻への変換方法
Date型のGMT時刻をOSで設定したタイムゾーンに応じたローカル時刻に変換してくれる
ことを期待して下記サンプル(SimpleDateFormatにTimeZoneを設定)を作成しました。
しかし、変換前後で時刻は変わりませんでした。
GMT時刻=2010/06/13 09:15:30 を作成。OSのタイムゾーンを日本に設定し、変換。
変換後の時刻は9時間後の2010/06/13 18:15:30を期待したのですが変換前後で変化は
ありませんでした。下記がそのサンプルなのですが何か問題がありますでしょうか。
また、サンプルではOSからタイムゾーンを取得しているのですがブラウザのタイムゾーンを
取得することはできるのでしょうか。HTTP request headersにはタイムゾーン情報は無く
JavaScriptを経由してとらないといけないという記述をどこかで見たことはあるのですが・・・。
【サンプル】
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class TimeZoneTest {
private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2010);
cal.set(Calendar.MONTH, 5);
cal.set(Calendar.DAY_OF_MONTH, 13);
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 15);
cal.set(Calendar.SECOND, 30);
Date todayDate = cal.getTime();
System.out.println("GMT時刻=" + formatter.format(todayDate).toUpperCase()); // GMT時刻=2010/06/13 09:15:30
String convertDate =convertTime(todayDate); // OSのTimeZoneId=Asia/Tokyo にて変換
System.out.println("ローカル時刻=" + convertDate); // ローカル時刻=2010/06/13 09:15:30 何故???
}
public static String convertTime(Date todayDate) {
String timeZoneId = TimeZone.getDefault().getID();
System.out.println("OSのTimeZoneId=" + timeZoneId); // OSのTimeZoneId=Asia/Tokyo
formatter.setTimeZone(TimeZone.getTimeZone(timeZoneId));
return formatter.format(todayDate).toUpperCase();
}
}
お礼
情報ありがとうございます。 やはり1分ごとの通知はなさそうなので、基本NSTimerで監視するようにしましたが、ユーザーが時刻を変更した場合の処理には使えそうですね。