• 締切済み

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

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • sech1152
  • ベストアンサー率72% (45/62)
回答No.1

表示2で、デフォルトのタイムゾーンで表示されるのは、仕様と考えていいと思います。 引用されているJavaDocの記述は、getTimeの場合はタイムゾーンとは関係ないと思います。 CalendarのgetTime()は、Dateオブジェクトを取得するものですが、Dateオブジェクトにはタイムゾーンは保持されていません。つまり、「元期」からのミリ秒だけがCalendarからDateに渡されます。 DateのtoString()は、ドキュメントには記述がありませんが、デフォルトのタイムゾーンで文字列表現にするようです。 参考:ひしだま's 技術メモページ Java 日付時刻・カレンダー http://www.ne.jp/asahi/hishidama/home/tech/java/date.html#java.util.Date

unko347
質問者

お礼

御回答ありがとうございます。 やはり仕様だったのですね。 getTime()メソッドで指定したタイムゾーンの時刻がDate型で 返ってくることを期待していたのですが別の方法を考えたいと 思います。ありがとうございました。

関連する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(); } }

    • ベストアンサー
    • Java
  • Java CDLC 1.0 での日付計算

    CLDC(携帯向けJava)での日付計算がうまくいきません。 JavaのSEでは、Calender.addなる日付計算関数があるようですが、 CLDC(携帯向けJava)では使えないみたいなので、以下の実験コードを 書いてみました。しかし、意図する結果が得られませんでした。 このケースでのよい計算方法をご存知でしたらご教授 頂ければうれしく思います。または、 以下のプログラムのバグ、ポカアホミス、作法的要修正点、 日付計算仕様的な可能/不可能等お気づきありましたら、 ご指摘頂ければ嬉しいです。 尚、意図した結果とは、下記の★部分において、 1970年1月1日(?曜日) 0:1:0 です。 グリニッジ標準時 1970 年 1 月 1 日 0:00:00 (エポック) からの 経過時間が、60000ミリ秒(60秒) というのを期待しました。 --以下コード-- void print_cal(Calendar cal){ String WEEK=" 日月火水木金土"; int year =cal.get(Calendar.YEAR); int month =cal.get(Calendar.MONTH)+1; int day_of_month=cal.get(Calendar.DAY_OF_MONTH); int day_of_week =cal.get(Calendar.DAY_OF_WEEK); int hour =cal.get(Calendar.HOUR_OF_DAY); int minute =cal.get(Calendar.MINUTE); int second =cal.get(Calendar.SECOND); System.out.println("" + year + "/" + month + "/" + day_of_month + "(" + WEEK.charAt(day_of_week) + ") " + hour + ":" + minute + ":" + second); } Calendar cal = Calendar.getInstance(); long now = cal.getTime().getTime(); print_cal(cal); cal.set(Calendar.YEAR, 2007); cal.set(Calendar.MONTH, Calendar.MAY); cal.set(Calendar.DAY_OF_MONTH, 31); cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 12); cal.set(Calendar.SECOND, 44); print_cal(cal); //<---- 2007/5/31(木) 6:12:44 long time1 = cal.getTime().getTime(); cal.set(Calendar.YEAR, 2007); cal.set(Calendar.MONTH, Calendar.MAY); cal.set(Calendar.DAY_OF_MONTH, 31); cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 13); cal.set(Calendar.SECOND, 44); long time2 = cal.getTime().getTime(); print_cal(cal); //<------ 2007/5/31(木) 6:13:44 long sabun = time2 - time1; //<---- 60000 Date hoge = new Date(sabun); long hoge_time = hoge.getTime(); System.out.println(hoge_time); <--- 60000 //setTime: Calendar の現在の時刻を、指定された Date に。 cal.setTime(hoge); //★この時点でprint_cal。 print_cal(cal); <---- 1970/1/1(木) 9:1:0 ?9時間も経ってる? long now2 = cal.getTime().getTime(); System.out.println("now2: " + now2); <--- 60000。でも60秒がはいってるぽい --コード以上--

    • ベストアンサー
    • Java
  • calendarクラスの使い方について

    時間データ(h:mm:ss)のみの差を求める場合に calendarクラスを利用しましたが 20時32分50秒というデータを cal.get(20,32,50)と記述して以下の プログラムを実行しても ---------結果 差:4838400 となりうまくいきません。 型があってないので、当然といえば当然かもしれませんが・・・ 本当は時刻、分、秒だけのデータで 差:115 と計算し表示させたいのです。 どうやったら、 2004,5,16,20,32,50 ではなく、 20,32,50の情報だけで時間と時間の差を 取得できるでしょうか 他の方法が思いつきませんので どなたかご存知であれば教えてください。 よろしくお願いします ---------プログラムリスト import java.util.Calendar; import java.util.Date; public class TestDate{ public static void main(String[] args){ Calendar cal1 = Calendar.getInstance(); cal1.set(2004,5,16,20,32,50); Date dat = cal1.getTime(); long date1 = dat.getTime(); Calendar cal2 = Calendar.getInstance(); cal2.set(2004,5,16,20,34,45); long date2 = cal2.getTime().getTime(); long distance = (date2 - date1) / (1000); System.out.println("差:"+distance); } } -----------------------------------------

    • ベストアンサー
    • Java
  • Calendarクラスの日付更新について

    ある日付を追加した時,うまく正式な日付になりません。 (1) 2002年9月30日にセットする (2) 1日追加する --→この時点で2002年9月31日になっている。 (3) 10月1日に正式な日付に直す という流れなのですが・・・ ソースは以下のとおりです。 public static void main(String[] args) {        Calendar cal = new GregorianCalendar();     /*(1)*/     cal.set(2002,9,30);    /*(2)*/     cal.add(Calendar.DATE,1); /*(3)*/ cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DATE) ); System.out.println(cal.get(Calendar.YEAR) "年"+ cal.getCalendar.MONTH) +"月"+ cal.get(Calendar.DATE) +"日"); } と、表示させると2002年10月1日になっておらず2002年9月31日になったままです。 これはどこに原因があるのでしょうか?ご指導お願いします。

    • ベストアンサー
    • Java
  • タイムゾーンのGMT+13:00って?

    Windows コントロールパネルの時間設定の中にタイム・ゾーンでGMT+13:00Nukualofaとあるのですが、 GMT+12:00までではなく、なぜGMT+13:00まであるのでしょうか?あと、Nukuakofaとは地域名なのでしょうか?

  • Javaのタイムゾーン設定

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

  • java.util.Dateについて

    まずは下記ソースを参照してください。 import java.util.Date; import java.util.GregorianCalendar; import java.util.Calendar; public class Test{     public static void main( String args[] ){         GregorianCalendar cal = new GregorianCalendar(2004, 5, 31);         System.out.println("年:" + cal.get(Calendar.YEAR));         System.out.println("月:" + cal.get(Calendar.MONTH));         System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));         System.out.println(); // ただの改行         System.out.println("比較:" + new Date().compareTo(cal.getTime()));     } } 上記ソースについて質問です。 1.「年」「月」「日」を表示しておりますが、本来ならば 「年:2004」 「月:5」 「日:31」 と表示されると思っておりましたが実際は、 「年:2004」 「月:6」 「日:1」 と表示されてしまいます。 なぜでしょうか? 2.12行目にてjava.util.DateクラスのcompareToメソッドを用いて、 現在日付(2004/5/28)と7行目で指定している日付の比較をしていますが、 7行目で設定している日付を現在日付よりも前後に設定して実行させても、 「-1」しか返りません。 なぜでしょうか? 環境は、 J2SDK:1.4.2 OS:Windows XP Pro です。

    • ベストアンサー
    • Java
  • タイムゾーンとシステム時間とローカル時間の関係

    少々ややこしいですがお付き合い下さい。 Windows2000Server日本語版を日本で使用しています。 Windowsにはシステム時間とローカル時間というのがあり、システム時間はGMTを、そこからタイムゾーンで設定した時差を元にローカルタ時間が計算され参照できると思っています。(間違えであれば指摘して下さい。) 例えばローカル時間を変更すると(プロンプトでtimeなどで変更する。)その時間を元にGMTを計算しシステム時間を計算して、システム時間を書きなおすという方法が取られていると思います。 現在の状況と問題点 ・タイムゾーンはアメリカ中部時間(GMT-6時間)に設定されている。 ・ローカルタイムを例えば3:00に設定する。 ・恐らくココでシステム時間(GMT)が9:00になるはず。 ・この状況でファイルを更新したり、イベントログを見たりすると、時間がおかしい。具体的には時刻が18:00になる。 恐らく、ファイルの更新日付の計算がGMT+9である事から出てきているのですが、この9時間は日本の時差ではありますが、タイムゾーンで設定されている時間ではありません。(タイムゾーンはアメリカだから) どこで設定されている時間から算出されているのでしょうか? (言語の設定?それともなんか他に固定で持っているものがあるのでしょうか?)

  • java Calendarクラス

    javaで月、日を入力してカレンダーを作成したのですが 年と月のsetでmonth-1はマジックナンバーなので直したいのですが どなたかわかる方教えてください。 package sample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Test { private final static int firstday = 1; public static void main(String[] args) { //カレンダーのインスタンスを取得します Calendar cal = Calendar.getInstance(); //文字入力 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //年を取得 int year =0; //月を取得 int month =0; //最後の日付 int lastDay =0; //月初めの曜日を取得 int week =0; //年妥当性チェック boolean CheckYear = true; //月妥当性チェック boolean CheckMonth = true; try { //年妥当性チェック while(CheckYear){ System.out.println("年を入力してください"); //年を入力します year = Integer.parseInt(input.readLine()); //年が4桁の場合 if(String.valueOf(year).length()==4){ CheckYear = false; }else{ System.out.println("年は4桁で入力してください"); } } //月妥当性チェック while(CheckMonth){ System.out.println("月を入力してください"); //月を入力します month = Integer.parseInt(input.readLine()); //月が1~12の場合 if(month>=1&&month<=12){ CheckMonth = false; }else{ System.out.println("月1~12を入力してください"); } } }catch(IOException e){ System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; }catch (Exception a) { System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; } //年、月をセットします cal.set(year,month-1,cal.getActualMinimum(Calendar.DATE)); //月初めの曜日を取得 week = cal.get(Calendar.DAY_OF_WEEK); //年月を出力する System.out.println(String.valueOf(year)+"年"+String.valueOf(month)+"月"); //曜日を出力する System.out.println("日 月  火  水  木  金  土"); //最後の日付を取得する lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); /* * 最後の日付を取得する */ if(month==1||month==3||month==7||month==8||month==10||month==12) { lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(month==4||month==6||month==9||month==11){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4==0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4!=0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /* * カレンダーを出力する */ //最後の日付まで繰り返す // 最後の日付まで繰り返す for (int i = 1; i <= lastDay; i++) { // 1日とそれ以外で分岐する if (i == 1) { // 1日の曜日位置まで移動する for (int j = 1; j < cal.get(Calendar.DAY_OF_WEEK); j++) { System.out.print(" "); } } else { // 日付を増やす cal.add(Calendar.DAY_OF_MONTH, firstday); } // 1~9と10~で表示を変える if (i < 10) { System.out.print(" " + i); } else { System.out.print(" " + i); } // 土曜日になったら改行する if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(""); } } } }

  • タイムゾーンと時刻について

    お尋ねいたします。 「日付と時刻のプロパティ」の「タイムゾーン」はGMT+09:00大阪 東京 札幌 に設定してあります。しかしGPSを取り込んで見たらその個体のタイムゾーンがGMT-0.03などとなり、再度インストール試みましたが変わりません。時刻調整のソフト等で(E-timing)調整してみましたらそのソフトも同じGMT-0.03になります。GPSのログファイルの時間帯が狂うので困っています。タイムゾーン調べたら-0.03等あるのでしょうか? それとインターネット時刻調整のサーバーが三個ありntp.nict.jpのみ同期しますが時刻は合いません、他の二つtime.windows.com、time.nist.govは同期に失敗となります。よろしくお願いいたします。 PC環境:Window XP SP2. Firefox ver2.00 追伸:GPSはGPS-CS1Kです。