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

Mar*_*szS 8 java time date jodatime

样品测试

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

奇怪的结果:

org.junit.ComparisonFailure: 
Expected :2015-03-29
Actual   :2015-03-28
Run Code Online (Sandbox Code Playgroud)

为何这有所不同?

stu*_*net 16

如果你要增加一个月2015/01/29,你会得到2015/02/29- 因为2015年不是闰年,那不是一个有效的日期,所以Joda选择2015/02/28,如记录:

添加可能会改变年份,但是日期通常不会改变.如果添加月份使日期无效,则会将其调整为该月份的最后一个有效日期.

而另外一个月的添加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)-我想,这是不是闰年更常见.