javascript setMonth()第二年的结果错误

时间:2014-05-25 10:18:16

标签: javascript

对于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

as setMonth描述说明:

  

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

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

浏览器Chrome。

2 个答案:

答案 0 :(得分:2)

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

var d = loanStart;

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

创建Date对象的副本:

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

答案 1 :(得分:1)

问题是您没有将时间添加到原始日期,而是将其添加到当前日期。所以设置月份&gt; 12到当前日期总是至少增加一年,这将增加年份。

您有两种解决方案:

  1. 确保您始终通过维护该日期的副本来修改原始日期。
  2. 做真实日期数学 - 尝试设置月份(并依赖副作用)当你真正想要做的是增加月份会使相当混乱的代码并且会有例如当天的情况这个月不是那个月的有效日。
相关问题