Получите перекрывающиеся месяцы в двух диапазонах, используя date-fns - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь получить перекрывающиеся месяцы в двух интервалах дат, используя date-fns :

const range1 = { start: new Date('2018-01-01'), end: new Date('2019-01-01') }
const range2 = { start: new Date('2018-07-03'), end: new Date('2019-12-01') }
getOverlappingMonthsInIntervals(a, b)) // 6

Глядя на документы date-fns, я вижу метод getOverlappingDaysInIntervals но подобного метода нет месяцами. Есть ли способ добиться этого с помощью date-fns или обходного пути (кроме getOverlappingDaysInIntervals/30)

1 Ответ

1 голос
/ 05 февраля 2020

Вы можете создать свою собственную функцию перекрытия месяцев, используя некоторые другие функции date-fns . Ниже приведен пример.

В своем ответе я предполагаю, что два интервала имеют перекрывающийся месяц, если оба интервала охватывают весь этот календарный месяц. Приведенные в вашем примере диапазоны имеют 5 перекрывающихся месяцев: август, сентябрь, октябрь, ноябрь и декабрь 2018 года.

  JFMAMJJASONDJFMAMJJASOND
1 |------+++++|
2       |+++++-----------|
  1. Сначала нам нужно определить, перекрываются ли эти два интервала.
  2. Если два интервала перекрываются, то определить дату начала и окончания интервалы перекрываются.
    • Если два интервала перекрываются, датой начала перекрытия будет максимум из двух интервалов дата начала . И датой окончания перекрытия будет минимум двух интервалов конец даты.
    • Мы можем использовать max и * Для этого используются функции 1033 *min.
  3. Как только мы находим начало и конец перекрытия, нам нужно определить, сколько месяцев в этом интервале.
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...