Java 月末のplusMonths


月末に対してplusMonthsとどうなるの?

2月には31日は存在しませんが、1/31にplusMonths()で1ヶ月を加算した場合はどうなるか気になり調べてみました。

ドキュメントによると

このメソッドは、3つの手順で、指定された量を月フィールドに加算します。
1. 入力された月数を、月フィールドに加算します
2. 結果となる日付が無効になるかどうかをチェックします
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になりました。