首页 > 解决方案 > 在日期范围数组中找到“差距”的最有效方法是什么?

问题描述

假设我有一组日期范围:

var date = [
    {
        start: '4/16/2021',
        end: '4/25/2021'
    },
    {
        start: '5/25/2021',
        end: '7/25/2021',
    },
    {
        start: '12/25/2021',
        end: '2/13/2022'
    }
];

在一年的窗口内查找日期范围内未涵盖的日期的最有效方法是什么?如果当前日期是 2021 年 4 月 16 日,则这些日期范围的预期“差距”将是:

  1. 2021 年 4 月 26 日至 2021 年 5 月 24 日
  2. 2021 年 7 月 26 日至 2021 年 12 月 24 日
  3. 2022 年 2 月 14 日至 2022 年 4 月 16 日

这是我到目前为止所尝试的。我知道这很糟糕,并且必须有一个更优雅的解决方案。

var gapRange = 365;
var window = new GlideDate();
window.addDaysUTC(gapRange);

for (var x = 0; x < dates.length; x++) {

    var next = x + 1;
    var endPlusOne = new GlideDate();
    endPlusOne.setValue(date[x].end);
    endPlusOne.addDaysUTC(1);

    // There is only one date
    if (date.length == 1) {

        if (date[x].start > today) {
            gap.push({
                start: today,
                end: date[x].start,
            });
        }
        if (date[x].end < window) {
            gap.push({
                start: endPlusOne,
                end: window,
                status: 'upcoming'
            });
        }
        continue;
    }
    // This is the first date 
    if (x == 0) {
        if (date[x].start > today) {
            // This date starts after today
            var startMinusOne = new GlideDate();
            startMinusOne.setValue(date[x].start);
            startMinusOne.addDaysUTC(-1);
            gap.push({
                start: today,
                end: startMinusOne,
                status: 'upcoming'
            });
        }
    }
    // This is not the last date
    if (x < last) {
        if (endPlusOne.getDisplayValue() !== date[next].start.getDisplayValue() && date[x].end < date[next].start) {
            var startMinusOne = new GlideDate();
            startMinusOne.setValue(date[next].start);
            startMinusOne.addDaysUTC(-1);
            gap.push({
                start: endPlusOne,
                end: startMinusOne,
                state: 'vacant',
                status: 'upcoming'
            });
        }
    }
    // This is the last date 
    if (x == last) {
        if (endPlusOne < window) {
            gap.push({
                start: endPlusOne,
                end: window,
                status: 'upcoming'
            });
        }
    }
}

// There are no dates 
if (date.length == 0) {
    // Create a gap from today to the gap window 
    gap.push({
        start: today,
        end: window,
        status: 'current'
    });

}

标签: javascriptdate

解决方案


推荐阅读