javascript - 在日期范围数组中找到“差距”的最有效方法是什么?
问题描述
假设我有一组日期范围:
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 日,则这些日期范围的预期“差距”将是:
- 2021 年 4 月 26 日至 2021 年 5 月 24 日
- 2021 年 7 月 26 日至 2021 年 12 月 24 日
- 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'
});
}