Java的.GregorianCalendar在几个月内的日期差异无法正常工作

a_s*_*ber 0 java java-date

java 6.0

假设今天是: 2018年8月8日

这里方法返回2个日期的差异,以月为单位.

    public static Integer getDiffMonths(Date dateFrom, Date dateTo) {
        Calendar cal1 = new GregorianCalendar();
        cal1.setTime(dateFrom);
        Calendar cal2 = new GregorianCalendar();
        cal2.setTime(dateTo);
        return differenceInMonths(cal1, cal2);
}

 private static Integer differenceInMonths(Calendar dateFrom, Calendar dateTo) {
        int month1 = dateFrom.get(Calendar.YEAR) * 12 + dateFrom.get(Calendar.MONTH);
        int month2 = dateTo.get(Calendar.YEAR) * 12 + dateTo.get(Calendar.MONTH);
        int diff = month2 - month1;
        return diff;
    }
Run Code Online (Sandbox Code Playgroud)

这里有4个测试用例的结果:

1.

currentDate = Aug 08 2018
DateTo =      Aug 13 2018
diffMonth = 0
Run Code Online (Sandbox Code Playgroud)

2.

currentDate = Aug 08 2018
DateTo =      Oct 14 2018
diffMonth = 2
Run Code Online (Sandbox Code Playgroud)

3.

currentDate = Aug 08 2018
DateTo =      Jan 03 2019
diffMonth = 5
Run Code Online (Sandbox Code Playgroud)

错误:差异必须是4个月

4.

currentDate = Aug 08 2018
DateTo =      Aug 03 2019
diffMonth = 12
Run Code Online (Sandbox Code Playgroud)

错误:差异必须是11个月

正如您所见,测试用例#1和#2是正确的,但测试用例#3和#4不正确.

为什么?

Hen*_*nry 6

你完全忽略计算差异的那一天.因此1月1日与1月31日相同.

前两个案例恰好在第二个日期有更多的一天,最后两个在较小的一天.但是这些信息被忽略了.