java 。 GregorianCalendar 以月为单位的日期差异无法正常工作

标签 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;
    }

这里是 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 是不正确的。

为什么?

最佳答案

计算差异时你完全忽略了这一天。因此 1 月 1 日与 1 月 31 日相同。

前两个案例恰好在第二个日期有更大的日子,最后两个案例有较小的日子。但此信息被忽略。

关于 java 。 GregorianCalendar 以月为单位的日期差异无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748409/

相关文章:

java - 我可以在应用程序服务器之外使用 JBoss JDBC 适配器吗?

java - 参数元数据不适用于 MariaDB 中的这些语句

java - 设置当前日期的格式以显示星期几

scala - 为什么在 spark 中不允许从 long to date 进行类型转换?

javascript - jQueryUI Datepicker 不接受不同的日期格式

R数据框-添加带有年份季度开始日期的新列

java - 如何检查 java map 包含什么类型的数据?

java - 检测双击 TableView JavaFX 的单元格

java - 递归合并两个排序的链接列表?

python - Pandas 拆解专栏