• ベストアンサー
  • すぐに回答を!

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
  • 閲覧数148
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1
  • wormhole
  • ベストアンサー率28% (1545/5420)

>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()を呼ぶとタイムゾーンが変えられるようですけどよろしいのでしょうか?(今のコードだとデフォルトタイムゾーンからデフォルトゾーンに変えてるので結果変わっていませんが)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

御回答ありがとうございます。 ご指摘事項をふまえ下記のように変更を加えてみた結果、 期待した値を得ることができました。 変換前の時刻を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(); } }

関連するQ&A

  • Java 日付の加算がうまくいきません。。どなたか助けてください・・・

    初歩的質問で申し訳ないのですが、ご存知の方ご教授ください。日付の加算についてどうしてもわからない箇所があります。 Calendar cal= Calendar.getInstance((TimeZone.getTimeZone("GMT"))); int year = 2007; int month = 1; int day = 1; cal.set(year,month,day); cal.add(Calendar.DAY_OF_MONTH,100); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); String tempDate=sdf.format(date); tempDate=2007/05/12 私が求めている結果は tempDate=2007/4/11 なのですが、tempDate=2007/05/12になってしまいます。 お願いします。 環境:WinXp pro Eclipse 3.1 JDK 1.4.2 2007/4/11は Oracle8i の実行結果です。 select to_date('2007-01-01') +100 from dual

    • ベストアンサー
    • Java
  • Calendarオブジェクトにタイムゾーンの設定

    Calendarクラスで不思議に思ったことがあったので質問させてください。 下記サンプルのようにCalendarオブジェクトに対してタイムゾーンを設定しました。 表示1ではGMTタイム(9時間前の時間)が表示。 表示2では現在の時刻(設定したタイムゾーンを無視) して表示されてしまいます。これは仕様でしょうか。 JavaDocのなかで下記記述を見つけたのですがこの記述と関係ありますでしょうか。 いまいち文章が難解でよくわからないのですがgetメソッドなら計算した値 (この場合、タイムゾーンを反映して計算した値)を返しますよ と言っているのかなと 思ったのですが違いますでしょうか。 【JavaDocの記述】 「カレンダフィールド値は、set メソッドを呼び出して設定できます。 Calendar 内で設定されたフィールド値はすべて、その時間値 (「元期」からのミリ秒) または カレンダフィールドの値を計算する必要が生じるまで解釈されません。 get、getTimeInMillis、getTime、add、および roll の呼び出しでは、この種の計算が行われます。」 【サンプル】 Calendar cal = Calendar.getInstance(); cal.setTimeZone(TimeZone.getTimeZone("GMT")); //表示1 System.out.println(cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" +          cal.get(Calendar.DAY_OF_MONTH) + " " +          cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" +          cal.get(Calendar.SECOND)); //表示2 System.out.println(cal.getTime().toString());

  • Solaris 5.6 タイムゾーン GMT-7 NTP

    Solaris 5.6で時刻をGMT-7(タイ)に設定したいのですが、NTPを利用しての設定方法を教えて下さい。 ・ntp.confに設定する「server」は、タイ国内の公開NTPサーバ(Stratum 1、Stratum 2など)でないと駄目なのでしょうか。もしそうならば、タイ国内の公開NTPサーバ(Stratum 1、Stratum 2など)のIPアドレスをいくつか教えて下さい。 ・Solarisでは、タイムゾーンという概念はあるのでしょうか。あるとすると、タイムゾーンをGMT-7(タイ)に設定しなくてはいけないかと思うのですが、どのように設定すれば良いのでしょうか。 ・タイムゾーンの設定をすると、世界中どのNTPサーバをntp.confに設定しても、取得した時刻をGMT-7に変換してくれるような仕様になってますでしょうか。 日本の時刻(GMT-9)しか合わせたことが無いため、タイのサーバ設定で困っています。よろしくお願い致します。

  • 入力した年月日が過去か現在か未来かを表示するプログラム

    import java.util.*; import java.io.*; import java.text.*; 大事なところだけ抜粋。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int year = Integer.parseInt(br.readLine()); int month = Integer.parseInt(br.readLine()); int day = Integer.parseInt(br.readLine()); Calendar cal = Calendar.getInstance(); cal.set(year,month-1,day); Calendar today = Calendar.getInstance(); SimpleDateFormat sbf = new SimpleDateFormat("yyMMdd"); Date date1 = cal.getTime(); Date date2 = today.getTime(); String result1 = sbf.format(cal); String result2 = sbf.format(today); 問題はここからです。 入力した年月日が過去か現在か未来か調べるのに<>=は使えないですよね。 どうすればいいのでしょうか。 アドバイス、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 異なるタイムゾーンのタイムサーバーとの時刻同期方法

    サーバー管理初心者の為、基本的なことかもしれませんがご教示下さい。 Unix(Solaris・AIX)、Linux(RedHat)でxntpdを用いてタイムサーバーと時刻同期設定をしようとしています。タイムサーバのタイムゾーンはJSTなのですが、タイムクライアント側{Unix(Solaris・AIX)、Linux(RedHat)の各サーバー}のタイムゾーンはGMTになっています。この場合でも、タイムゾーンがサーバー・クライアントと同じ時同様に、ntp.confでタイムサーバの設定を実施後にxntpdを起動すればJSTのタイムサーバーから取得した時刻を自動的にGMTのタイムゾーンに変換してくれますか?又、タイムサーバーとタイムクライアント側のタイムゾーンが異なると同期が取れないという場合は、サーバー・クライアントのタイムゾーンが異なった状態のままで、どの様にすれば同期が取れる様になるか、その方法を教えて頂ければと思います。 宜しくお願いします。

  • Javaのタイムゾーン設定

    お世話になります。 現在Javaで動いているアプリがありまして、 日付の処理で異常がありました。 どうやらOSの日付よりも-9時間のようです。 グリニッジくさいと思ったので、 OSの設定を見たところ、OS側は GMT+9:00 の東京になっていました。 Javaでjava.util.TimeZoneを使って調べたところ、 GMT グリニッジ標準時 オフセット0となりました。 どうやらJava側のタイムゾーンだけずれているようなのですが、 Javaのタイムゾーンを変更する方法はあるのでしょうか?

  • 文字列から読み込んだ時刻の操作について。

    こんにちは。お時間のある時にお願いします。 文字列表記された時刻を、ある特定のフォーマットに変換し、尚且つタイムゾーンの計算をして、ソートさせるプログラムを組んでいます。 時間の加減算には、Calenderクラス、 String型からDate型に変換するには、SimpleDateFormatクラスが良さそうだ、と思って触っています。 ----- String strPreTime = "Sun, 11 Dec 2005 03:00:38 +0900"; //変換後時刻フォーマット -> 2005-12-11T03:00:38+0900 SimpleDateFormat sdf = new SimpleDateFormat(); sdf.setDateFormatSymbols(new DateFormatSymbols(Locale.US)); //日付の出力形式を設定 sdf.applyPattern("EEE, d MMM yyyy HH:mm:ss Z"); Date dat = sdf.parse(strPreTime); System.out.println("test1: "+dat); sdf.applyPattern("yyyy-MM-dd'T'HH:mm:ssZ"); String dat2 = sdf.format(dat); System.out.println("test2: " +dat2); ----- 出力結果: test1: Sun Dec 11 03:00:38 JST 2005 test2: 2005-12-11T03:00:38+0900 となりますが、test1の出力結果が、sdf.applyPattern("EEE, d MMM yyyy HH:mm:ss Z");で指定した出力形式になっておらず、頭を悩ませています。 どこを直せば、指定した通りの出力形式になるのか、教えてください。 また、Date型の時にタイムゾーンだけを抽出する、というのはどうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • Javaによる現在時刻の表示について

    Javaで現在時刻を表示するプログラムを作りました。 今のままだと 2009/8/26(木) 15:8:7となり、 月日・時間分秒が一桁のときは前に0をつけて二桁(15:08:07のように)表示にしたいと思います。 何かいい方法はないでしょうか? if文で作成するとなると、かなりたくさんのコードを書かないといけない気がします。 良い案があれば是非ご教授頂ければと思います。 import java.util.Calendar; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Servlet_106 extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{ res.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = res.getWriter(); String title = "現在時刻:"; Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DATE); StringBuffer dow = new StringBuffer(); switch (cal.get(Calendar.DAY_OF_WEEK)){ case Calendar.SUNDAY: dow.append("日"); break; ~~~(略)~~~ } int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); out.println("<html lang=\"ja\">"); out.println("<head><title></title></head>"); out.println("<body>"); out.println("<p>現在時刻:" + year + "/" + month + "/" + day + "(" + dow + ")" + hour + ":" + minute + ":" + second + "</p>"); out.println("</body></html>"); out.close(); } }

    • ベストアンサー
    • Java
  • EclipseでCalendarクラスの中身の確認

    EclipseでCalendarクラスの中身を確認する方法についての質問です。 Calendarクラスのインスタンスを生成し、set()にて任意の日付を設定しました。 オブジェクトの中身を確認するためEclipseのデバッグモードでcalオブジェクトの内容を 確認してみました。オブジェクトの中身を見ると「cdate」、「gdate」には 現在の年月しか設定されていないようです。 そこでDate date = cal.getTime();としてDate型にすると任意の時刻が設定されている ことが確認できました。 Date型に変換しないでCalendarクラスのまま任意の日付が設定されていることを確認したい のですがどこを見ればよいのでしょうか。 public static void main(String[] args) throws ParseException { Calendar cal = Calendar.getInstance(); cal.set(2015, 5, 13, 14, 16); Date date = cal.getTime(); System.out.println(date.toString()); }

    • ベストアンサー
    • Java
  • importが分からない

    importが違うせいだと思いますが、コンパイルできるように直してください。 import java.util.Date; import java.text.SimpleDateFormat; import java.util.Locale; public class a {  public static void main (String args[]) {   Date d = calendar.getTime();   SimpleDateFormat f = new SimpleDateFormat("EEE", Locale.JAPANESE);   String s = f.format(d);   System.out.println(s);  } }