difference in months between two dates

This question already has an answer here:

  • Number of days between two dates in Joda-Time 6 answers

  • Changing the first date to 2015-02-02, Joda correctly returns 1 month:

    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.
    

    So my guess is that because you didn't provide a time portion, Joda cannot be precise about exactly which point in time of 2015-01-01 date2 refers to. You might have as well referred to 23:59:59 , in which case a full month wouldn't have elapsed yet, technically.

    If you provide a zero time portion explicitly, it works as you initially expected:

    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.
    

    Therefore, I recommend you specify a 00:00:00 time portion in each date explicitly .


    While other answers are correct they still mask the real problem.

    it returns 0 because there is no month in the middle of the two dates

    No. It returns 0 because there is time part of DateTime object. You creating two istances of DateTime filled with current moment in time (with hours, minutes, seconds and milliseconds) and then modify just date part. There is no reasons to do it if you want to compare just two dates. use LocalDate instead.

    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
    

    Also need to pay attention to the fact that despite the fact that Months docs say nothing about it, Month can contain negative value if first date is after second date. So we need to use Math.abs to really count the number of months between two dates.

    The docs say:

    Creates a Months representing the number of whole months between the two specified partial datetimes.

    But it isn't true. It really calculates the difference in months. Not the number of months.


    The way this is calculated depends on the business logic that is to be used. Each month varies in length. One option would be to, in the monthsBetween() function, get the start of the month for both date1 and date2 , and compare that.

    Something like:

    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/36650.html

    上一篇: 到期日期控制程序

    下一篇: 两个日期之间的月差