对于m = 1到12的范围,它按预期工作,将月份增加1。
对于m =范围13-不能按预期工作,将年份增加1。

作为m exceeds 12 inside loop,我期待的结果是:

Sun Feb 28 2015 00:00:00 GMT+0400 (GET)
Tue Mar 28 2015 00:00:00 GMT+0400 (GET)
Sat Apr 28 2015 00:00:00 GMT+0400 (GET)


相反,我得到:

Sun Feb 28 2016 00:00:00 GMT+0400 (GET)
Tue Mar 28 2017 00:00:00 GMT+0400 (GET)
Sat Apr 28 2018 00:00:00 GMT+0400 (GET)


...

var loanAmount = 3800,
    loanInterest = 32, // %
    loanDuration = 48, // Month
    loanGrace = 0,
    loanFee = 1, // %
    loanInitMonth = 0,
    loanInitDay = 28,
    loanInitYear = 2014;

var loanStart = new Date(loanInitYear,loanInitMonth,loanInitDay);

for (var m = loanInitMonth; m < loanDuration; m++) {
    var d = loanStart;
    d.setMonth(m);
    console.log(m);
    console.log(d);
}


Jsfiddle

如setMonth描述所示:


  如果您指定的参数超出预期范围,则setMonth
  尝试更新Date对象中的日期信息
  相应地。例如,如果您将15用作monthValue,则年份将为
  增加1(年+ 1),将3用作月份。


我显然没有得到这种行为。

浏览器Chrome。

最佳答案

执行此操作时,将引用复制到Date对象,而不是创建该对象的新副本:

var d = loanStart;


然后,当您更改d变量中的日期时,您也将更改loanStart变量中的日期,因为它是同一对象。

创建Date对象的副本:

var d = new Date(loanStart.getTime());

关于javascript - javascript setMonth()第二年错误的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23854237/

10-12 12:32