首页 > 解决方案 > 爪哇。GregorianCalendar 月份的日期差异不正确

问题描述

爪哇 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;
    }

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

1.

currentDate = Aug 08 2018
DateTo =      Aug 13 2018
diffMonth = 0

2.

currentDate = Aug 08 2018
DateTo =      Oct 14 2018
diffMonth = 2

3.

currentDate = Aug 08 2018
DateTo =      Jan 03 2019
diffMonth = 5

错误:差异必须是 4 个月

4.

currentDate = Aug 08 2018
DateTo =      Aug 03 2019
diffMonth = 12

错误:差异必须是 11 个月

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

为什么?

标签: javadate

解决方案


在计算差异时,您完全忽略了这一天。所以 1 月 1 日与 1 月 31 日相同。

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


推荐阅读