7

HOUR_OF_DAY フィールドを設定し、GregorianCalendar 日付オブジェクトのタイムゾーンを変更しようとしています。

GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
date.set(Calendar.HOUR_OF_DAY, 23);
//date.get(Calendar.HOUR_OF_DAY);
date.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));

出力:

HOUR: 16
HOUR: 23

何らかの理由で、別のタイムゾーンを設定した後、HOUR_OF_DAY の値が変更されません。しかし、HOUR_OF_DAY の date.get のコメントを外すと、すべてが正常に機能します。

GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));
date.set(Calendar.HOUR_OF_DAY, 23);
date.get(Calendar.HOUR_OF_DAY); // uncommenting this line will is changing the output
date.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY));

出力:

HOUR: 16
HOUR: 13

これはどのように可能ですか?.get メソッドがオブジェクトの動作を変更するのはなぜですか?

4

2 に答える 2

10

クラスはからメソッドをGregorianCalendar継承します。これには次の副作用があります。getCalendar

寛大なモードでは、すべてのカレンダー フィールドが正規化されます。

これは、オブジェクトで が呼び出されると、time値とすべてのフィールドが再計算されることを意味します。これは、いくつかの予測できない動作につながる可能性があります。特に、独自のバグのある動作が文書化されていると結合した場合に顕著です。getCalendarsetTimeZone

于 2012-09-27T23:54:04.990 に答える