将日期对象存储到数组

时间:2013-09-22 11:12:37

标签: javascript date for-loop

我有两个日期,想要在数组之间保存日期(加上开始和结束日期)

    var date1 = new Date("Sep 23, 2013 12:00:00"); // Monday
    var date2 = new Date("Sep 26, 2013 12:00:00"); // Thursday

    var alldates = [];

    for (var i=0; date1 <= date2; date1.setDate(date1.getDate() + 1), i++) {
        alldates.push(date1);
        }

    alert(alldates.join('\n'));

使用此代码alert(alldates.join('\n'));显示以下内容

    Fri Sep 27 2013 12:00:00 GMT+0200
    Fri Sep 27 2013 12:00:00 GMT+0200
    Fri Sep 27 2013 12:00:00 GMT+0200
    Fri Sep 27 2013 12:00:00 GMT+0200

我是Javascript的新手并想进一步了解,所以感谢您解释为什么alert没有显示

    Mon Sep 23 2013 12:00:00 GMT+0200
    Tue Sep 24 2013 12:00:00 GMT+0200
    Wed Sep 25 2013 12:00:00 GMT+0200
    Thu Sep 26 2013 12:00:00 GMT+0200

3 个答案:

答案 0 :(得分:11)

您遇到的问题是推送对date1对象的引用。在循环中更改日期时,更新对象,但所有引用仍指向同一对象。

您需要推送日期的文字表示或date1对象的副本

for (var i=0; date1 <= date2; date1.setDate(date1.getDate() + 1), i++) {
    alldates.push(new Date(date1));
    }

alert(alldates.join('\n'));

如建议的那样,使用while循环

while( date1 <= date2 ) {
  alldates.push(new Date(date1));
  date1.setDate( date1.getDate() +1 );
} 

答案 1 :(得分:0)

您的数组正在存储单个日期对象的引用,并且每次调用setDate时,每个对象都会使用新的日期值进行更新。

因此最好将新的日期对象推送到数组中,如下所示

var date1 = new Date("Sep 23, 2013 12:00:00"); // Monday
var date2 = new Date("Sep 26, 2013 12:00:00"); // Thursday

var alldates = [];
// pushing first date
alldates.push(new Date(date1.setDate(date1.getDate())));

for (var i=0; date1 <= date2; i++) {

    alldates.push(new Date(date1.setDate(date1.getDate() + 1)));
}

alert(alldates.join('\n'));

答案 2 :(得分:0)

要回应其他答案,问题在于被压入数组的元素不是一个保持不变的值-它引用的是Date对象,该对象在循环中发生了变化,因此所有对存储在date1中的alldates被设置为date1的最终值。

可接受的答案可以完成工作,但是它也会更改date1的值。 OP以这种方式设置代码,这表明这对他们来说不是问题。但是,如果您不想突变date1,可以使用以下替代方法:

const date1 = new Date("Sep 23, 2013 12:00:00"); // Monday
const date2 = new Date("Sep 26, 2013 12:00:00"); // Thursday

const alldates = Array
  .from(Array(date2.getDate() - date1.getDate() + 1), () => new Date())
  .map((el, ind) => new Date(el.setTime(date1.getTime() + 1000 * 60 * 60 * 24 * ind)));

console.log(alldates.join("\n"));

EXPLANATION:这将首先创建一个足够大的数组以存储开始日期,结束日期和之间的日期,并用Date个对象填充该数组。接下来,map对数组中的每个元素应用一个函数,该函数使用每个连续值的索引乘以一天中的毫秒数来产生所需的结果。