为什么我会遇到意想不到的2021年?

var dueDates = [];
var dDate = '2014-01-01';

dDate = new Date(dDate);

for (var i = 1; i <= 18; i++) {

    dDate.setMonth(i);
    dueDates.push(dDate);

}
console.log(dueDates);


演示http://jsfiddle.net/gQ92L/

最佳答案

代码有两个问题。


您将相同的Date对象一遍又一遍地推到数组中,因此最终将得到一个充满了对单个Date对象的引用的数组。
您反复将月份值设置为大于11的值,这样也将使年份向前推进。当您执行setMonth(12)时,您将在2015年1月结束,而当您执行setMonth(13)时,您将在2016年2月结束。最终您将达到2021年。


为每次迭代创建一个新的Date对象,并在其上设置月份,以便始终从同一日期开始:

var dueDates = [];
var dDate = '2014-01-01';

dDate = new Date(dDate);

for (var i = 1; i <= 18; i++) {

    var d = new Date(dDate.getTime());
    d.setMonth(i);
    dueDates.push(d);

}
console.log(dueDates);


注意:从setMonth(1)开始,这将在2月。如果要从一月开始,则必须从零开始。

10-01 17:32