CalendarクラスでXヶ月後の日付を求める際の注意

Calendar#addメソッドを利用して月の加減算を行う際、処理の方法によって結果が変わる場合がある。

1ヶ月ずつの加算を繰り返す場合、加算の度に日付のフィールドが正常な範囲内に収められてしまうため、以下のような結果になる。

Calendar calendar1 = Calendar.getInstance();
calendar1.set(2019, Calendar.JANUARY, 31, 0, 0);
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(calendar1.getTime())); // 2019/01/31
calendar1.add(Calendar.MONTH, 1); // ここで日付が 2019/02/28 となっている
calendar1.add(Calendar.MONTH, 1);
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(calendar1.getTime())); // 2019/03/28

そのため、基準の日付からXヶ月後の日付をピンポイントに求める場合、1回の加算で行わなければならない。

Calendar calendar2 = Calendar.getInstance();
calendar2.set(2019, Calendar.JANUARY, 31, 0, 0);
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(calendar2.getTime())); // 2019/01/31
calendar2.add(Calendar.MONTH, 2);
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(calendar2.getTime())); // 2019/03/31