0

当我尝试添加接近 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

4 回答 4

2

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

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

于 2013-07-10T00:14:19.050 回答
1

在 javascriptDate中,月份分数是从零开始的

所以第11个月是12月

于 2013-07-10T00:13:08.290 回答
1

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

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

接着

return dat.getDate() + "/" + (dat.getMonth()+1) + "/" + dat.getFullYear();
于 2013-07-10T00:18:53.677 回答
0

我认为问题在于您将 3 添加到indexOf(). 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/ 。当然,您的格式是日/月/年。

顺便说一句,你可以把它放在+一个字符串的前面,把它转换成一个数字。

于 2013-07-10T01:11:15.663 回答