34

Date オブジェクトのgetMonth()メソッドにバグがあるようです。d日付がであると仮定すると、次のよう2013-01-31に月を設定しようとしdます:

const d = new Date(); // 2013-01-31

d.setMonth(8);
console.log(d.getMonth());

結果は9です。なんで?Chrome と Firefox の両方でこれをテストしました。

31 日、30 日、29 日の場合、日数の少ない月を日付に設定するとgetMonth間違った値が返されることがわかりました。

4

7 に答える 7

48

これを分解してみましょう:

var d = new Date(); // date is now 2013-01-31
d.setMonth(1);      // date is now 2013-02-31, which is 3 days past 2013-02-28
x = d.getMonth();   // what to do, what to do, 3 days past 2013-02-28 is in March
                    // so, expect x to be March, which is 2

これは、 の日の値が にd渡された月の最大日数より大きい場合にのみ問題になりsetMonth()ます。それ以外の場合は、期待どおりに機能します。

于 2013-02-04T04:37:04.730 に答える
20

これに対する最も簡単な解決策は、setMonth に 2 番目の引数を追加することです。

var d = new Date();
d.setMonth(8,1);
d.getMonth(); //outputs 8

http://www.w3schools.com/jsref/jsref_setmonth.asp

Date.setMonth(月,日)

日: オプション。月の日を表す整数期待される値は 1 ~ 31 ですが、他の値も使用できます。

0 は前月の最終日 -1 は前月の最終日の前日になります 月が 31 日ある場合:

32 は翌月の最初の日になります。月が 30 日ある場合:

32 は翌月の 2 日になります。

于 2014-07-31T11:42:21.863 に答える
11

JavaScript の月は 0 ~ 11 で表されます。月 1 は 28/29 日しかない 2 月であるため、月を 1 に設定すると、日付を 3 月に自動修正して、意味のある日付にしようとします (2 月 31 日以降は意味がありません)。toDateString 関数を使用して試してみて、私が何を意味するかを確認してください。

 var d = new Date('2013/01/31');
 d.setMonth(2);
 console.log(d.toDateString()); // outputs Match 3rd, 2013

おそらく少し奇妙ですが、バグではありません。

于 2013-02-04T04:36:04.253 に答える
8

javascript では、月は 0 から始まります。今日が 2012 年 2 月 4 日であると仮定すると、setMonth(1) は 2 月に設定しようとします。2 月の最大日は 28/29 であるため、翌月 (3 月は 2) に移動します。

于 2013-02-04T04:38:33.557 に答える