开发者问题收集

javascript 数组日期错误

2016-11-10
137

我对这个有点困惑。

这段代码运行良好,但行为很奇怪。

var tmpcurdte = eval(dataSource[i].startDate);
tmpcurdte.setDate(tmpcurdte.getDate() + 1);

while (tmpcurdte < tmpenddte) {
  console.log("block date: " + tmpcurdte);
  blockdayarray[blockdayarray.length] = tmpcurdte;
  console.log("blockdayarray: " + blockdayarray);
  tmpcurdte.setDate(tmpcurdte.getDate() + 1);
}

输出

block date :Sat Nov 12 2016 00:00:00 GMT+0100 (CET)
blockdayarray :**Sat Nov 12** 2016 00:00:00 GMT+0100 (CET)
block date :Sat Dec 31 2016 00:00:00 GMT+0100 (CET)
blockdayarray :**Sun Nov 13** 2016 00:00:00 GMT+0100 (CET),**Sat Dec 31** 2016 00:00:00 GMT+0100 (CET)
block date :Sun Jan 01 2017 00:00:00 GMT+0100 (CET)
blockdayarray :Sun Nov 13 2016 00:00:00 GMT+0100 (CET),**Sun Jan 01 2017** 00:00:00 GMT+0100 (CET),**Sun Jan 01 2017** 00:00:00 GMT+0100 (CET)
block date :Sat Feb 04 2017 00:00:00 GMT+0100 (CET)
blockdayarray :Sun Nov 13 2016 00:00:00 GMT+0100 (CET),Mon Jan 02 2017 00:00:00 GMT+0100 (CET),**Mon Jan 02 2017** 00:00:00 GMT+0100 (CET),Sat Feb 04 2017 00:00:00 GMT+0100 (CET)

正如您所见,当我推送新日期时,数组中的前一个日期会发生变化。有人可以帮忙/解释一下吗?

1个回答

这是因为您正在反复将 相同的 Date 对象推送到数组上,并更改其状态。

相反,您想要为第二天创建一个 新的 Date 对象:

var tmpcurdte = eval(dataSource[i].startDate);
tmpcurdte.setDate(tmpcurdte.getDate()+1);

while (tmpcurdte < tmpenddte) {
    console.log("block date :" + tmpcurdte);
    blockdayarray[blockdayarray.length]=tmpcurdte;
    console.log("blockdayarray :" + blockdayarray);
    tmpcurdte = new Date(tmpcurdte.getTime());     // ***
    tmpcurdte.setDate(tmpcurdte.getDate() + 1);
}

附注:我不太清楚您调用 eval 做了什么,但几乎肯定有更好的方法来完成您要做的事情。

T.J. Crowder
2016-11-10