0

カレンダーが月末 (たとえば 7 月 31 日) の場合、

c.add(Calendar.DAY_OF_MONTH, 1);

c を同じ月の初めの 7 月に設定しますか、それとも c を次の月の 8 月に進めますか?

4

2 に答える 2

1

「フィールド操作java.util.Calendar」という名前のセクションで、スーパークラスのドキュメントを見てください(強調は私のものです):

add(f, delta)フィールドに追加deltaしますf。これはset(f, get(f) + delta)、次の 2 つの調整を使用して呼び出すことと同じです。

ルール 1 を追加します。呼び出し後のfield の値から呼び出し前fの field の値を引いた値は、 fieldで発生したオーバーフローを法として計算されます。フィールド値がその範囲を超えるとオーバーフローが発生し、その結果、次に大きいフィールドが増分または減分され、フィールド値がその範囲に戻されます。fdeltaf

そのadd(Calendar.DAY_OF_MONTH, 1)ため、7 月 31 日が 8 月 1日に変更されます。

対照的に、ドキュメントは次のように続きます。

roll(f, delta)delta大きなフィールドを変更せずにフィールドに追加しfます。これはadd(f, delta)、次の調整を使用して呼び出すことと同じです。

ロールルール大きなフィールドは、呼び出し後に変更されません。フィールドが大きいほど、時間の単位が大きくなります。DAY_OF_MONTHよりも大きなフィールドですHOUR

そのroll(Calendar.DAY_OF_MONTH, 1)ため、7 月 31 日が 7 月1日に変更されます。

于 2016-07-16T04:15:55.277 に答える
0

Calendar オブジェクトの月は 0 から始まるため、1 は 2 月を意味します。2 月の最終日は 28 日なので、出力は 3 月 2 日になるはずです。

0 = January = Calendar.JANUARY
1 = february = Calendar.FEBRUARY

それで

Calendar calendar = new GregorianCalendar();

int year       = calendar.get(Calendar.YEAR);
int month      = calendar.get(Calendar.MONTH); 
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1
于 2016-07-16T03:46:49.393 に答える