没有从两个日期获得有效的月份数

问题描述

需要使用 java 8 确定两个日期之间的月数,但没有获得正确的月数。请找到以下程序

public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy",Locale.ENGLISH);
        YearMonth startDate = YearMonth.parse("12/31/2020",formatter);
        YearMonth endDate = YearMonth.parse("12/01/2021",formatter);
        
        System.out.println(startDate.plusYears(1) + " :: " + endDate + " :: " + startDate.plusYears(1).isBefore(endDate));
        
        long monthsBetween = ChronoUnit.MONTHS.between(startDate,endDate);
        System.out.println(monthsBetween);
}

输出::

2021-12 :: 2021-12 :: false
12

所以从上面的程序中,我们在这两个日期之间有 12 个月的时间"12/31/2020" and "12/01/2021"

但实际上上述日期之间没有几个月是 13,那么我们如何得到 12 而不是 13?

可能是我错了,但有人可以解释一下

注意:date format is MM/dd/yyyy

解决方法

您获得 12 个月的原因是因为 'To' 月份被排除在计数之外。 这里是 between 方法的实现,

 //-----------------------------------------------------------------------
    @Override
    public long between(Temporal temporal1Inclusive,Temporal temporal2Exclusive) {
        return temporal1Inclusive.until(temporal2Exclusive,this);
    }
,

pratap 的回答完全正确。来自 between() 的文档:

计算返回一个整数,代表的个数 两个时间之间的完整单位。例如,金额在 时间 11:30 和 13:29 之间的时间将仅为一小时 一分钟不到两小时。

另一种说法是,计算中不包括结束月份。这反过来意味着解决方案是在结束月份增加一个月:

    long monthsBetween = ChronoUnit.MONTHS.between(startDate,endDate.plusMonths(1));

现在输出就是你想要的:

13