ChronoUnit.MONTHS.between не следует подходу Half-Open - PullRequest
0 голосов
/ 18 января 2019

У меня есть 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 ]

0 голосов
/ 18 января 2019

Как говорит доктор о 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"
0 голосов
/ 18 января 2019

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

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

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

  1. Декабрь
  2. Январь
  3. Февраль
  4. Март
  5. Апрель

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

...