为什么我的js约会在11月左右开始计算错误?

时间:2013-07-10 00:09:17

标签: javascript datetime

当我尝试添加接近11月30日(任何一年)的日子时,我的代码表现得很有趣:

Date.prototype.addDays = function(days){
    this.setDate(this.getDate() + days);
    return this;
};

function calculateDate(string_date, days_to_add){
    var arr, dat;

    arr = string_date.split(" ");
    dat = new Date(2013, (("enefebmarabrmayjunjulagosepoctnovdic".indexOf(arr[1])+3)/3), (((arr[0].charAt(0)!="0")?arr[0]:arr[0].substring(1))*1));
    dat.addDays(days_to_add*1);

    return (dat.getDate() + "/" + dat.getMonth() + "/"+dat.getFullYear());
}

现在如果我使用:

  • calculateDate("07 nov",24);返回31/11/2013(我的日程表示2013年11月停在30日)
  • calculateDate("07 nov",25);返回1/0/2014

我的代码似乎在任何其他月份和日期都能正常运行,那么为什么我的代码在11月到12月附近无法正常工作?让计算机产生感情并要求假期以便继续工作吗?

4 个答案:

答案 0 :(得分:2)

Date对象getMonth是一个从零开始的索引:

请注意“十一月”有31天?

答案 1 :(得分:1)

在javascript Date中,月份分数从零开始

所以11月是12月

答案 2 :(得分:1)

您的月份不是从零开始的,但它应该在JS Date objects中。用它来创建日期对象:

dat = new Date(2013,
               "enefebmarabrmayjunjulagosepoctnovdic".indexOf(arr[1])/3,
               parseInt(arr[0], 10)
);

然后

return dat.getDate() + "/" + (dat.getMonth()+1) + "/" + dat.getFullYear();

答案 3 :(得分:0)

我认为问题在于您向indexOf()添加了3。 indexOf('nov')是32 + 1将是33.此外,Date.getMonth()是0-11索引。

尝试类似:

Date.prototype.addDays = function(days){
  this.setDate(this.getDate() + days);
  return this;
}
function calculateDate(string_date, days_to_add){
  var arr = string_date.split(' ');
  var dat = new Date(2013, ('janfebmaraprmayjunjulaugsepoctnovdec'.indexOf(arr[1])+1)/3, +(arr[0].charAt(0) !== '0' ? arr[0] : arr[0].substring(1)));
  dat.addDays(+days_to_add);
  return (dat.getDate() + '/' + (dat.getMonth()+1) + '/' + dat.getFullYear());
}

有关工作示例,请参阅http://jsfiddle.net/PHPglue/V3hYQ/3/。当然,您的格式是日/月/年。

顺便说一下,你可以把+放在一个字符串前面把它投射到一个数字。