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)
- 我想,这比闰年更常见。
样本测试
@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)
- 我想,这比闰年更常见。