如何使用Java的Joda API在几个月内计算差异

我正在编写一个程序,它应该只计算2个给定日期之间的月份并将值返回给程序。 例如,如果我必须计算4月1日到6月30日之间的月数(这是一个季度,3个月),我使用以下代码:

DateTime start = new DateTime().withDate(2011, 4, 1); DateTime end = new DateTime().withDate(2011, 6, 30); Months mt = Months.monthsBetween(start, end); int monthDiff = mt.getMonths(); 

使用这个,我仍然得到“2”作为月数,而实际上是“3”个月。 这是我想要的一个例子。 我只计算月数(即从开始月份的第1天到结束月份的最后一天),我不需要额外的分析,如天,周,小时等。我如何实现这一目标?

任何帮助,将不胜感激。

 DateTime start = new DateTime().withDate(2011, 4, 1); DateTime end = new DateTime().withDate(2011, 6, 30); Period p = new Period(start, end, PeriodType.months().withDaysRemoved()); int months = p.getMonths() + 1; 

您需要withDaysRemoved()部分以确保在月数中添加一个有效。 否则, 2011-04-152011-06-14两个日期仍然会导致答案为2

你为什么期望答案是3 months ? 确切的答案是两个月一点点 ,这将导致你得到两个月

如果您想要按此间隔“触摸”的月数 ,这是一个完全不同的问题。 只需在差异结果中加1即可。

 Months mt = Months.monthsBetween( start.monthOfYear().roundFloorCopy(), end.monthOfYear().roundCeilingCopy() ); 

y1m1为开始日期的年份和月份, y2m2为结束日期的年份和月份。 然后是开始和结束之间的月数,包括开始和结束日期的月份

 (y2 - y1) * 12 + (m2 - m1) + 1 

Joda算法正确计算了这两个日期之间的差异。 这个伪代码将是解释它如何工作的最简单方法:

 // (1) monthsBetween(2011.6.14, 2011.4.15) = 1 monthsBetween(2011.6.15, 2011.4.15) = 2 // (2) monthsBetween(2011.6.30, 2011.4.1) = 2 monthsBetween(2011.7.1, 2011.4.1) = 3 

要做你想做的事,你需要“改进”joda算法:

  • 计算两个日期之间的距离(使用正常月份)
  • 如果您有特定情况:一个日期的月份的最后一天和第二个日期的月份的第一天,请在最终结果中添加+1。
 DateTime start = new DateTime().withDate(2011, 4, 1); DateTime end = new DateTime().withDate(2011, 2, 1); Period p = new Period(start, end, PeriodType.months().withDaysRemoved()); int months = p.getMonths(); System.out.println(months); wrong output in this case