使用 date-fns 获取两个范围内的重叠月份
Get overlapping months in two ranges using date-fns
我正在尝试使用 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
除外)
实现此目的
您可以使用其他一些函数创建自己的重叠月份函数
date-fns 函数。请参阅下面的示例。
在我的回答中,我假设两个间隔有一个重叠的月份
如果两个间隔都跨越整个日历月。以你为例
范围内有 5 个重叠月份:8 月、9 月、10 月、11 月和
2018 年 12 月。
JFMAMJJASONDJFMAMJJASOND
1 |------+++++|
2 |+++++-----------|
- 首先我们需要判断这两个区间是否重叠。
- 这可以使用
areIntervalsOverlapping
函数来完成。
- 如果两个时间间隔重叠,则确定时间间隔的开始和结束日期
间隔重叠的地方。
- 找到重叠的起点和终点后,我们需要确定有多少重叠
个月在这个区间内。
- 我们可以使用
differenceInCalendarMonths
(或者,
differenceInMonths
) 这个函数。
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
我正在尝试使用 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
除外)
您可以使用其他一些函数创建自己的重叠月份函数 date-fns 函数。请参阅下面的示例。
在我的回答中,我假设两个间隔有一个重叠的月份 如果两个间隔都跨越整个日历月。以你为例 范围内有 5 个重叠月份:8 月、9 月、10 月、11 月和 2018 年 12 月。
JFMAMJJASONDJFMAMJJASOND
1 |------+++++|
2 |+++++-----------|
- 首先我们需要判断这两个区间是否重叠。
- 这可以使用
areIntervalsOverlapping
函数来完成。
- 这可以使用
- 如果两个时间间隔重叠,则确定时间间隔的开始和结束日期 间隔重叠的地方。
- 找到重叠的起点和终点后,我们需要确定有多少重叠
个月在这个区间内。
- 我们可以使用
differenceInCalendarMonths
(或者,differenceInMonths
) 这个函数。
- 我们可以使用
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