使用带有for循环的日期对象时会出现意外情况

时间:2014-01-17 18:46:57

标签: javascript date

为什么我会像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);

DEMO http://jsfiddle.net/gQ92L/

1 个答案:

答案 0 :(得分:3)

代码存在两个问题。

  1. 您一遍又一遍地将相同的Date对象推送到数组,因此最终会得到一个充满对单个Date对象的引用的数组。

  2. 您反复将月份值设置为高于11的值,这样也可以推动这些年。如果你{2015年1月}结束setMonth(12),那么你最终会在2016年2月结束setMonth(13)。最后你将在2021年结束。

  3. 为每次迭代创建一个新的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月。如果你想从一月开始,你必须从零开始。