カレンダーが月末 (たとえば 7 月 31 日) の場合、
c.add(Calendar.DAY_OF_MONTH, 1);
c を同じ月の初めの 7 月に設定しますか、それとも c を次の月の 8 月に進めますか?
カレンダーが月末 (たとえば 7 月 31 日) の場合、
c.add(Calendar.DAY_OF_MONTH, 1);
c を同じ月の初めの 7 月に設定しますか、それとも c を次の月の 8 月に進めますか?
「フィールド操作java.util.Calendar
」という名前のセクションで、スーパークラスのドキュメントを見てください(強調は私のものです):
add(f, delta)
フィールドに追加delta
しますf
。これはset(f, get(f) + delta)
、次の 2 つの調整を使用して呼び出すことと同じです。ルール 1 を追加します。呼び出し後のfield の値から呼び出し前
f
の field の値を引いた値は、 fieldで発生したオーバーフローを法として計算されます。フィールド値がその範囲を超えるとオーバーフローが発生し、その結果、次に大きいフィールドが増分または減分され、フィールド値がその範囲に戻されます。f
delta
f
その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日に変更されます。
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