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はゼロベースのインデックスです:

「11 月」が 31 日あることに注目してください。

于 2013-07-10T00:14:19.050 に答える
1

JavaScriptDateでは、月の端数は 0 から始まります

11月は12月だから

于 2013-07-10T00:13:08.290 に答える
1

月はゼロベースではありませんが、JSDateオブジェクトにする必要があります。これを使用して、日付オブジェクトを作成します。

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 になります。また、 0 ~ Date.getMonth()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 に答える