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:
- Декабрь
- январь
- февраль
- марш
- апрель
Как вы думаете, почему это должно быть 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"