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

时间:2013-12-02 14:24:21

标签: javascript

我们说我有一系列N个日期:

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

查找第一个日期和最后一个日期之间所有缺失日期的最快方法是什么? (我们假设日期从最早到最晚排序)。

差距不一致,可以是任何规模。

我宁愿不使用任何库,只需要纯粹的javascript。

2 个答案:

答案 0 :(得分:2)

通常,如果您有两个已排序的数组,并且想要找到另一个中缺少的项目,那么您将在paralel中迭代两个。我的解决方案类似于那个,但在日期数组上使用了一个生成器:

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-padded,因此2013-01-01和2013-1-1之间的比较将失败。这可以通过制作更智能的比较功能来解决,但我认为它超出了问题的范围。

答案 1 :(得分:0)

我会做一个日期差异,并为任何遗漏的日期生成新日期,如下所示:

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

相关问题