【问题标题】:Get overlapping months in two ranges using date-fns使用 date-fns 在两个范围内获取重叠月份
【发布时间】:2020-05-21 07:01:20
【问题描述】:

我正在尝试使用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 除外)

【问题讨论】:

    标签: javascript node.js date-fns


    【解决方案1】:

    您可以使用其他一些函数创建自己的重叠月份函数 date-fns 函数。请参阅下面的示例。

    在我的回答中,我假设两个间隔有一个重叠的月份 如果两个时间间隔都跨越整个日历月。鉴于你的例子 范围有 5 个重叠月份:8 月、9 月、10 月、11 月和 2018 年 12 月。

      JFMAMJJASONDJFMAMJJASOND
    1 |------+++++|
    2       |+++++-----------|
    
    1. 首先我们需要确定两个区间是否重叠。
    2. 如果两个时间间隔重叠,则确定时间间隔的开始和结束日期 间隔重叠的地方。
      • 如果两个间隔重叠,则重叠开始日期将是最大值 两个间隔的开始日期。并且,重叠结束日期将是 最小两个间隔结束日期。
      • 我们可以为此使用maxmin 函数。
    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
    

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多