Java 如何获取日期之间的月数?

Java 如何获取日期之间的月数?,java,java-time,Java,Java Time,在这个例子中,now和now+2个月之间的差异不等于2,尽管我认为LocalDate数学是这样工作的: import java.time.LocalDate; import static java.time.temporal.ChronoUnit.MONTHS; public class MyClass { public static void main(String... args) { LocalDate now = LocalDate.of(2020, 7

在这个例子中,
now
now+2个月
之间的差异不等于2,尽管我认为
LocalDate
数学是这样工作的:

import java.time.LocalDate;
import static java.time.temporal.ChronoUnit.MONTHS;

public class MyClass {
    public static void main(String... args) {
            LocalDate now = LocalDate.of(2020, 7, 31);
            LocalDate later = now.plusMonths(2);
            
            System.out.println("Now: " + now);
            System.out.println("Later: " + later);
            System.out.println("Months between now and later: " + MONTHS.between(now, later));
    }
}
产出:

Now: 2020-07-31
Later: 2020-09-30
Months between now and later: 1
我发现这一点仅仅是因为我碰巧运行了一个单元测试,该测试的日期违反了预期

查看LocalDate.addMonths的javadoc:

此方法将指定的金额以三种方式添加到“月份”字段中 步骤:

例如,2007-03-31加上一个月将导致无效 日期2007-04-31。不是返回无效结果,而是最后一个 改为选择月份的有效日期2007-04-30

这意味着这是工作的预期。因此,不必求助于老式日期/时间api

<>强>什么是获得两个日期之间的月份数的正确方法?< /强>

< p>可以使用该类只考虑年和月。
导入
java.time.temporal.ChronoUnit
java.time.YearMonth

我认为您的方法非常正确,`MONTHS.between`注释显示:*计算返回一个整数,表示两个日期之间*完整单位的数量。*例如,2012-06-15和2012-08-14*之间的月数金额将仅为一个月,因为它比两个月少一天。
Add the input months to the month-of-year field
Check if the resulting date would be invalid
Adjust the day-of-month to the last valid day if necessary
System.out.println(
    "Months between now and later:"  + 
    ChronoUnit.MONTHS.between(
        YearMonth.from(now), 
        YearMonth.from(later)
    )
);