Как узнать количество месяцев между датами? - PullRequest
2 голосов
/ 05 августа 2020

Разница между now и now + 2 months не равна 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

Я узнал об этом только потому, что мне довелось запустить модульный тест, который пришелся на дату, которая нарушает ожидания ...

Проверка javado c для LocalDate.addMonths:

Этот метод добавляет указанную сумму в поле месяцев в три этапа:

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

Например, 31.03.2007 плюс один месяц приведет к недопустимой дате 2007-04-31. Вместо того, чтобы возвращать недопустимый результат, выбирается последний действительный день месяца, 2007-04-30.

Это означает, что это работает как задумано. Итак, не прибегая к vintage Date / Time api ...

Каков правильный способ получить количество месяцев между двумя датами?

1 Ответ

5 голосов
/ 05 августа 2020

Вы можете использовать класс YearMonth только для учета лет и месяцев. Демо

System.out.println(
    "Months between now and later:"  + 
    ChronoUnit.MONTHS.between(
        YearMonth.from(now), 
        YearMonth.from(later)
    )
);

Импорт java.time.temporal.ChronoUnit и java.time.YearMonth.

...