1

次のスニペットについて

GregorianCalendar a = new GregorianCalendar(2009, 11, 10);
System.out.println(a.getTime()); // Thu Dec 10 00:00:00 ICT 2009
a.add(Calendar.MONTH, 1);
System.out.println(a.getTime()); // Sun Jan 10 00:00:00 ICT 2010

この行を変更すると

a.add(Calendar.MONTH, 1);

この行に

a.set(Calendar.MONTH, a.get(Calendar.MONTH) + 1);

同じ結果を返します

// Sun Jan 10 00:00:00 ICT 2010

2009 年 12 月の場合、月 + 1 (つまり 1 月) に設定すると、月は 2009 年 1 月になるはずですが、代わりに 2010 年 1 月です。

では、この場合のセットと追加の違いは何ですか?

4

3 に答える 3

1

Calendar#add(int field, int amount)指定した量だけカレンダーを増やします。あなたの場合、1 か月追加されます。

Calentar#set(int field, int value)フィールドを指定された値に設定し、他のフィールドは変更しません。あなたの場合、月を1月に設定します。

以下も参照してください。

Calendar#roll(int field, int value)指定されたフィールドを指定された値だけインクリメントしますが、上位のフィールド (この場合は年) は変更されません (2010 年 10 月 + 4 か月 => 2010 年 2 月)

于 2012-10-22T05:46:11.377 に答える
0

デフォルト値が設定されている場合、現在のカレンダーに値が追加されます(あなたの場合)

月の値を設定する場合は、日付を設定する前に以下のように設定できます。

Calendar cal = GregorianCalendar.getInstance(); cal.set(Calendar.MONTH, 0);

月を 1 月として返します

于 2012-10-22T06:36:48.673 に答える
0

set実際には、月が 12 月より 1 多い年をインクリメントしているようです。

以下では

a.set(Calendar.MONTH, a.get(Calendar.MONTH) + 1);

a.get(Calendar.MONTH)は 12 月であり、それに 1 を加えて結果をカレンダー オブジェクトに設定すると、論理的には実際には翌年の 1 月になるため、この場合も年の値を変更するのは十分公平です。

そうしないと、カレンダー インスタンスが無効な状態になり、月の値が無効になります。

次のコードを確認できます。

Calendar cal = new GregorianCalendar(2009, Calendar.DECEMBER, 10);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, Calendar.DECEMBER + 1);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, Calendar.JANUARY + 5);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, Calendar.DECEMBER + 13);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, -3);
System.out.println(cal.getTime());

出力は次のとおりです。

2009 年 12 月 10 日木曜日 00:00:00 CST
日 1 月 10 日 00:00:00 CST 2010
2010 年 6 月 10 日木曜日 00:00:00 CDT
火曜日 1 月 10 日 00:00:00 CST 2012
月曜日 10 月 10 日 00:00:00 CDT 2011

そのため、設定されている月の値が範囲外の場合、年の値が変更されます。

于 2012-10-22T06:41:53.713 に答える