みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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();
}
}

投稿日時 - 2017-04-01 07:35:18

QNo.9311863

すぐに回答ほしいです

質問者が選んだベストアンサー

>System.out.println("GMT時刻=" + formatter.format(todayDate).toUpperCase()); // GMT時刻=2010/06/13 09:15:30

GMT時刻で出力してるつもりのようですがデフォルトタイムゾーン(OSのタイムゾーン)での出力ですよ?

>Calendar cal = Calendar.getInstance();

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);

ですので設定されている2010/05/13 09:15:30はデフォルトタイムゾーンでの2010/05/13 09:15:30です。

>private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

この時点でのformatterのタイムゾーンはデフォルトタイムゾーンです。
なのでformat()で出力されるのはデフォルトタイムゾーンでの時刻です

あとformatterは、convertTime()を呼ぶとタイムゾーンが変えられるようですけどよろしいのでしょうか?(今のコードだとデフォルトタイムゾーンからデフォルトゾーンに変えてるので結果変わっていませんが)

投稿日時 - 2017-04-01 11:24:06

お礼

御回答ありがとうございます。
ご指摘事項をふまえ下記のように変更を加えてみた結果、
期待した値を得ることができました。
変換前の時刻をGMTのタイムゾーンで変換し、
変換メソッド(convertTime)の中でOSのタイムゾーンに変換。

【サンプル】
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class TimeZoneTest {


public static void main(String[] args) {
// GMTタイムを取得
Date gmtTime = getGmtTime();

// OSのTimeZoneId=Asia/Tokyo にて変換
String convertDate =convertTime(gmtTime);

// ローカル時刻(Asia/Tokyo)に変換
System.out.println("ローカル時刻=" + convertDate);
}


public static Date getGmtTime() {;
Calendar cal = Calendar.getInstance();
Date gmtTime = cal.getTime();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("GMT時刻=" + formatter.format(gmtTime).toUpperCase());

return gmtTime;
}

public static String convertTime(Date todayDate) {
String timeZoneId = TimeZone.getDefault().getID();
System.out.println("OSのTimeZoneId=" + timeZoneId); // OSのTimeZoneId=Asia/Tokyo

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone(timeZoneId));

return formatter.format(todayDate).toUpperCase();
}
}

投稿日時 - 2017-04-01 21:50:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問