月末に対してplusMonthsとどうなるの?
2月には31日は存在しませんが、1/31にplusMonths()
で1ヶ月を加算した場合はどうなるか気になり調べてみました。
ドキュメントによると
このメソッドは、3つの手順で、指定された量を月フィールドに加算します。
- 入力された月数を、月フィールドに加算します
- 結果となる日付が無効になるかどうかをチェックします
- 必要に応じて、「月の日」を最後の有効な日に調整します
たとえば、2007-03-31に1月を加算すると、2007-04-31という無効な日付が生じます。無効な結果を返す代わりに、その月の最後の有効な日である2007-04-30が選択されます。
まずは月を足して、足した月に該当する日付があるかどうかチェックします。該当する日付がない場合は、月の最終日を返すようです。
確認
LocalDate date = LocalDate.of(2020,1,31);
System.out.println(date.plusMonths(1));
// 2020-02-29
LocalDate date = LocalDate.of(2020,1,30);
System.out.println(date.plusMonths(1));
// 2020-02-29
LocalDate date = LocalDate.of(2020,1,29);
System.out.println(date.plusMonths(1));
// 2020-02-29
LocalDate date = LocalDate.of(2020,1,28);
System.out.println(date.plusMonths(1));
// 2020-02-28
該当しない日付に対しては、有効な日付が戻ってきてますね
余談
plusMonths
の後にminusMonths
したらどうなるのでしょうか?
LocalDate date = LocalDate.of(2020,1,31);
System.out.println(date.plusMonths(1).minusMonths(1));
// 2020-01-29
plusMonths
で2020-02-29になり、2020-02-29にminusMonths
をしているので結果は2020-01-29になりました。