Вы можете создать свою собственную функцию перекрытия месяцев, используя некоторые другие функции date-fns . Ниже приведен пример.
В своем ответе я предполагаю, что два интервала имеют перекрывающийся месяц, если оба интервала охватывают весь этот календарный месяц. Приведенные в вашем примере диапазоны имеют 5 перекрывающихся месяцев: август, сентябрь, октябрь, ноябрь и декабрь 2018 года.
JFMAMJJASONDJFMAMJJASOND
1 |------+++++|
2 |+++++-----------|
- Сначала нам нужно определить, перекрываются ли эти два интервала.
- Если два интервала перекрываются, то определить дату начала и окончания интервалы перекрываются.
- Если два интервала перекрываются, датой начала перекрытия будет максимум из двух интервалов дата начала . И датой окончания перекрытия будет минимум двух интервалов конец даты.
- Мы можем использовать
max
и * Для этого используются функции 1033 *min
.
- Как только мы находим начало и конец перекрытия, нам нужно определить, сколько месяцев в этом интервале.
import {
areIntervalsOverlapping,
max,
min,
// differenceInMonths,
differenceInCalendarMonths,
} from 'date-fns'
const getOverlappingMonthsInterval = (r1, r2) => {
if (areIntervalsOverlapping(r1, r2)) {
const start = max([r1.start, r2.start])
const end = min([r1.end, r2.end])
return differenceInCalendarMonths(end, start) // or use `differenceInMonths`
} else return 0
}
const range1 = { start: new Date('2018-01-01'), end: new Date('2019-01-01') }
const range2 = { start: new Date('2018-07-01'), end: new Date('2019-12-01') }
console.log(getOverlappingMonthsInterval(range1, range2)) // 5
Мне нравится использовать условный оператор для таких функций:
// one-liner
const getOverlappingMonthsInterval = (r1, r2) =>
areIntervalsOverlapping(r1, r2)
? differenceInCalendarMonths(
min([r1.end, r2.end]),
max([r1.start, r2.start])
)
: 0