0

I am having the following code

    Calendar calendar = Calendar.getInstance();

    calendar.set(2011, 7, 29);      //case 1    
   // calendar.set(2011, 7, 30);      //case 2
   // calendar.set(2011, 7, 31);    //case 3

    System.out.println("===After seting the date== "+calendar.getTime());

    System.out.println("=================================================================");

    calendar.add(Calendar.MONTH, 6);


    System.out.println("===result after adding 6 months==  "+calendar.getTime());

and for the case 2 and case 3 also i am getting the same results. it should overflow to next month and show the new date. but its not happening.

4

2 に答える 2

4

「する必要がある」を「これは私がやりたいことです」という意味で使用しているのか、「これは文書化されていると信じていることです」という意味で使用しているのかは明らかではありません. ドキュメントは実際に与えられた動作をバックアップします:

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

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

ルール 2 を追加します。より小さなフィールドが不変であると予想されるが、フィールド f が変更された後の最小値または最大値の変更、またはタイム ゾーン オフセットの変更などのその他の制約のために、以前の値と等しくなることが不可能な場合、その値は、期待値にできるだけ近づくように調整されます。フィールドが小さいほど、時間の単位が小さくなります。HOUR は、DAY_OF_MONTH よりも小さいフィールドです。不変であると予想されない小さなフィールドは調整されません。暦法は、どのフィールドが不変であると予想されるかを決定します。

さらに、set() とは異なり、add() はカレンダーのミリ秒とすべてのフィールドの即時再計算を強制します。

例: 最初に 1999 年 8 月 31 日に設定された GregorianCalendar を考えてみましょう。翌年。GregorianCalendar では DAY_OF_MONTH を 9 月の 31 にすることはできないため、ルール 2 を追加して DAY_OF_MONTH を最も近い値である 30 に設定します。小さいフィールドですが、DAY_OF_WEEK は規則 2 によって調整されません。これは、GregorianCalendar で月が変わると変更されることが予想されるためです。

例の 2 番目の部分はまさにあなたが直面している状況です: DAY_OF_MONTH は不変であると予想されますが、適切な月内に留まるために変更する必要があるため、可能な限り近い値 (この場合は 29) に調整されます。 .

ですから、私にはその振る舞い一貫しているように見えます - どのように矛盾していると思いますか?

于 2012-05-04T12:20:56.980 に答える
0

グレゴリオ暦を使用して実現する最も簡単な方法は、次のとおりです。翌月の 1 日になるのを防ぐため、毎月の日付を翌月末日に設定します。

フォローしてみてください。

cal.set(Calendar.DAY_OF_MONTH, Math.min(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)));

于 2012-06-01T06:15:42.477 に答える