两个日期之间的月差
这个问题在这里已经有了答案:
将第一个日期更改为2015-02-02,Joda正确返回1个月:
DateTime date1 = new DateTime().withDate(2015, 2, 2);
DateTime date2 = new DateTime().withDate(2015, 1, 1);
System.out.println(Months.monthsBetween(date2, date1).getMonths());
// Returns 1.
所以我的猜测是,因为你没有提供时间部分,所以Joda无法准确确定2015-01-01 date2
所指的时间点 。 您也可以参考23:59:59 ,在这种情况下,从技术角度来说,整整一个月还不会过去。
如果您明确提供了零时间部分,则其工作方式与您最初的预期相同:
DateTime date1 = new DateTime().withDate(2015, 2, 1).withTime(0, 0, 0, 0);
DateTime date2 = new DateTime().withDate(2015, 1, 1).withTime(0, 0, 0, 0);
System.out.println(Months.monthsBetween(date2, date1).getMonths());
// Returns 1.
因此,我建议您明确指定每个日期00:00:00时间部分。
虽然其他答案是正确的,但它们仍然掩盖真正的问题。
它返回0,因为在这两个日期中间没有月份
不。它返回0,因为有DateTime对象的时间部分。 您创建了两个充满当前时间(包括小时,分钟,秒和毫秒)的DateTime
,然后修改日期部分。 如果你只想比较两个日期,没有理由去做。 改用LocalDate。
LocalDate date1 = new LocalDate(2015, 2, 1);
LocalDate date2 = new LocalDate(2015, 1, 1);
Months m = Months.monthsBetween(date1, date2);
int monthDif = Math.abs(m.getMonths());//this return 1
另外需要注意的事实是,尽管月份文档没有提及它,但如果第一个日期在第二个日期之后, Month
可以包含负值。 所以我们需要使用Math.abs
来计算两个日期之间的月数。
文档说:
创建一个月,表示两个指定的部分日期时间之间的整个月数。
但事实并非如此。 它真的会计算几个月内的差异 。 不是几个月。
计算方式取决于要使用的业务逻辑。 每个月的长度都不相同。 一种选择是,在monthsBetween()
函数中,获取date1
和date2
的月份开始,然后比较。
就像是:
DateTime firstOfMonthDate1 = new DateTime(date1.getYear(), date1.getMonthOfYear(), 1, 0, 0);
DateTime firstOfMonthDate2 = new DateTime(date2.getYear(), date2.getMonthOfYear(), 1, 0, 0);
Months m = Months.monthsBetween(firstOfMonthDate1, firstOfMonthDate2)
链接地址: http://www.djcxy.com/p/36649.html