在日期范围内查找丢失日期的最有效方法是什么

What is the most efficient way of finding missing dates within a daterange

本文关键字:日期 有效 是什么 方法 范围内 查找      更新时间:2024-01-16

假设我有一个N个日期的数组:

var dates = ['2013-01-01', '2013-01-02', '2013-01-05' ...]

找到第一次约会和最后一次约会之间所有丢失的日期最快的方法是什么?(假设日期是从最早到最晚排序的)。

间隙不一致,可能有任何大小。

我宁愿不使用任何库,只使用纯javascript。

通常,如果您有两个排序的数组,并且希望从另一个数组中找到缺失的项,则可以在parallel中对这两个数组进行迭代。我的解决方案与此类似,但使用了一个生成器日期数组:

function DateIterator(date){
  this.current = date;
}
DateIterator.prototype.next = function() {
  this.current.setDate(this.current.getDate() + 1);
  return this.current.getFullYear() + '-' + 
    (this.current.getMonth()+1) + '-' + 
    this.current.getDate();
};

var dates = ['2013-1-1', '2013-1-2', '2013-1-5' ,'2013-2-2'];
var di = new DateIterator(new Date(dates[0]));
var date, missing = [];
for (var i=1; i<dates.length; i++) {  
  while ((date = di.next()) !== dates[i]) {
    missing.push(date);    
  } 
}
console.log(missing);

请注意,日期的检查是通过比较字符串值来完成的。next返回的日期不是0填充的,因此2013-01-01和2013-1-1之间的比较将失败。这可以通过制作一个更智能的比较函数来解决,但我认为这超出了问题的范围。

我会进行日期差异,并为任何丢失的日期生成新的日期,如下所示:

var dates = [new Date(2013,1,1), new Date(2013,1,2), new Date(2013,1,5)];
var missingDates = [];
for (var i = 1; i < dates.length; i++)
{
    var daysDiff = ((dates[i] - dates[i - 1]) / 86400000) - 1;
    for (var j = 1; j <= daysDiff; j++)
    {
        var missingDate = new Date(dates[i - 1]);
        missingDate.setDate(dates[i - 1].getDate() + j);
        missingDates.push(missingDate);
    }
}
console.log(missingDates);

JSFiddle