3

我有两个日期,想将中间的天数(加上开始和结束日期)保存在一个数组中

    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
4

3 回答 3

12

您遇到的问题是您推送对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 );
} 
于 2013-09-22T11:25:35.263 回答
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'));
于 2013-09-22T11:32:26.647 回答
0

为了回应其他答案,问题是被推送到数组的元素不是保持不变的值 - 它指的是在循环中发生变化的对象,因此对存储在的Date所有引用都设置为最终值的。date1alldatesdate1

接受的答案可以完成工作,但它也会改变 的值date1。OP 设置了具有这种副作用的代码,这表明这对于他们的用例来说不是问题。但是,如果您不想 mutate date1,这里有另一种 ES6 风格的、无副作用的方法:

const date1 = new Date("Sep 23, 2013 12:00:00"); // Monday
const date2 = new Date("Sep 26, 2013 12:00:00"); // Thursday
const msPerDay = 1000 * 60 * 60 * 24; // 86400000
const inclusiveDateLength = (date2 - date1) / msPerDay + 1; // 4

const allDates = Array.from(Array(inclusiveDateLength), (_, i) => {
  const newDate = new Date(date1);
  newDate.setDate(date1.getDate() + i);

  return newDate;
});

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

说明:我们创建一个数组,将其填充为新的Date s,并用 增加每个 Dates 的月份日期Date.prototype.setDate()。的一个很酷的特性Array.from是它接受一个map函数作为它的第二个参数。我们利用函数中的索引值 ( i)来增加每个日期的月份中的日期 - 请注意,这也适用于map环绕,例如Sep 29Oct 02

Temporal API可用时,它可能会为这个问题提供更好的解决方案。

于 2019-01-24T23:54:42.187 回答