如何使用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-15
和2011-06-14
两个日期仍然会导致答案为2
你为什么期望答案是3 months
? 确切的答案是两个月一点点 ,这将导致你得到两个月 。
如果您想要按此间隔“触摸”的月数 ,这是一个完全不同的问题。 只需在差异结果中加1即可。
Months mt = Months.monthsBetween( start.monthOfYear().roundFloorCopy(), end.monthOfYear().roundCeilingCopy() );
设y1
和m1
为开始日期的年份和月份, y2
和m2
为结束日期的年份和月份。 然后是开始和结束之间的月数,包括开始和结束日期的月份
(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