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

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

締切り済みの質問

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

投稿日時 - 2017-04-02 12:53:00

QNo.9312407

すぐに回答ほしいです

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

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

回答(1)

ANo.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

投稿日時 - 2017-04-05 00:06:56

お礼

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

投稿日時 - 2017-04-05 06:51:11

あなたにオススメの質問