ChronoUnit.MONTHS.between не следует подходу Half-Open

У меня есть 2 LocalDate что я хочу найти разницу между:

LocalDate date1 = LocalDate.of(2018,11,30);
LocalDate date2 = LocalDate.of(2019, 5, 1);

Когда я выполню:

long mthsDiff = ChronoUnit.MONTHS.between(date1, date2);

Это возвращает 5, но это действительно должно быть 6.

Почему ChronoUnit.MONTHS.between не уважая Half-Open approach? Должен ли он вернуть месяц апреля (2019-04-30)? Я что-то пропустил?

Я понимаю, что второй аргумент является исключительным. Ниже приведены сценарии, которые я ожидаю:

date1 = 2018-11-16
date2 = 2019-04-15
expect 5

date1 = 2018-11-16
date2 = 2019-04-16
expect 5

date1 = 2018-11-16
date2 = 2019-04-17
expect 6

date1 = 2018-11-16
date2 = 2019-04-15
expect 5

2 ответа

Решение

Я думаю, что документация говорит все это здесь:

Вычисление возвращает целое число, представляющее количество полных единиц между двумя темпоралами. Например, сумма в часах между моментами времени 11:30 и 13:29 будет составлять только один час, поскольку одной минуте не хватает двух часов.

Количество полных месяцев между 30 ноября и 1 мая: 5:

  1. Декабрь
  2. январь
  3. февраль
  4. марш
  5. апрель

Как вы думаете, почему это должно быть 6? Полуоткрытый просто говорит, что первый день включительно, а последний день - эксклюзивно. За исключением 1 мая ничего не происходит, весь апрель все еще в диапазоне. В том числе 30 ноября это еще не целый месяц, так что это еще 5.

Как говорит док о ChronoUnit.between

Вычисление возвращает целое число, представляющее количество полных единиц между двумя темпоралами.

А также

// these two lines are equivalent
between = thisUnit.between(start, end);
between = start.until(end, thisUnit);

Таким образом, между 5 месяцами

"2018-11-30"
December -> 1
January  -> 2
February -> 3
March    -> 4
May      -> 5
"2019-05-01"
Другие вопросы по тегам