两个日期之间的月差

这个问题在这里已经有了答案:

  • Joda-Time中的两个日期之间的天数6个答案

  • 将第一个日期更改为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()函数中,获取date1date2的月份开始,然后比较。

    就像是:

    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

    上一篇: difference in months between two dates

    下一篇: How to subtract two joda datetimes?