Java SE8の日付APIを触っていたらふと思ったので試してみた。重箱の隅をつつくような話。
2016-01-31という日付について、「1ヶ月後の1ヶ月前」「1ヶ月前の1ヶ月後」という演算をそれぞれ施すと結果が異なる。
LocalDate.of(2016, 1, 31).plusMonths(1).minusMonths(1); // 2016-01-29
LocalDate.of(2016, 1, 31).plusMonths(1).minusMonths(1); // 2016-01-31
1月と2月では月末の日が異なり(31日と28日)、12月と1月では月末の日が一致するので(どっちも31日)このようなことが起こる。
似たような話でうるう年を利用すると。
LocalDate.of(2016, 2, 29).plusYears(1).minusYears(1); // 2016-02-28
LocalDate.of(2016, 2, 29).plusYears(4).minusYears(4); // 2016-02-29
どちらも「n年後のn年前」という演算を施しているが、n=1とn=4では結果が異なる。