我有两个日期,想要在数组之间保存日期(加上开始和结束日期)
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
答案 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
对数组中的每个元素应用一个函数,该函数使用每个连续值的索引乘以一天中的毫秒数来产生所需的结果。