JodaTime:plusMonths(1) 两次不同于 plusMonths(2)

JodaTime: plusMonths(1) two times differ from plusMonths(2)

样本测试

@Test
public void should_be_equals(){
    LocalDate now = new LocalDate(2015,01,29);
    assertThat(now.plusMonths(1).plusMonths(1)).isEqualTo(now.plusMonths(2));
}

奇怪的结果:

org.junit.ComparisonFailure: 
Expected :2015-03-29
Actual   :2015-03-28

为什么不同?

如果您要在 2015/01/29 上加一个月,您会得到 2015/02/29 - 由于 2015 年不是闰年,因此该日期无效,因此 Joda 选择 2015/02/28 , as documented:

The addition may change the year, but the day-of-month is normally unchanged. If adding months makes the day-of-month invalid, it is adjusted to the last valid day in the month.

再向 2015/02/28 添加一个月将得到实际日期 2015/03/28

添加两个月时不会出现缺少 2 月 29 日的问题,因为 Joda 永远不会得到无效日期。

这同样适用于,例如,new LocalDate(2015, 03, 31).plusMonths(2)new LocalDate(2015, 03, 31).plusMonths(1).plusMonths(1) - 我想,这比闰年更常见。