ang*_*ala 2 javascript node.js 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
Run Code Online (Sandbox Code Playgroud)
查看 date-fns 文档,我看到了该方法,getOverlappingDaysInIntervals但几个月没有类似的方法。有没有办法通过 date-fns 或解决方法(除了getOverlappingDaysInIntervals/30)来实现这一点
您可以使用其他一些date-fns函数创建自己的重叠月份 函数。请参阅下面的示例。
在我的回答中,如果两个时间间隔跨越整个日历月,我假设两个时间间隔有一个重叠的月份。鉴于您的示例范围,有 5 个重叠月份:2018 年 8 月、9 月、10 月、11 月和 12 月。
JFMAMJJASONDJFMAMJJASOND
1 |------+++++|
2 |+++++-----------|
Run Code Online (Sandbox Code Playgroud)
areIntervalsOverlapping函数来完成。differenceInCalendarMonths(or,
differenceInMonths) 函数。 JFMAMJJASONDJFMAMJJASOND
1 |------+++++|
2 |+++++-----------|
Run Code Online (Sandbox Code Playgroud)
我喜欢对这样的函数使用条件运算符:
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
Run Code Online (Sandbox Code Playgroud)