次の JavaScript は、示されているとおりの結果を生成します。
dat0 = new Date(2012, 9, 31);
dat0.setMonth(dat0.getMonth() + 1); // Oct 31 + 1 month = Dec. 1
dat1 = new Date(2011, 0, 31); // Jan 31 (non leap year)
dat1.setMonth(dat1.getMonth() + 1); // Mar 3
dat2 = new Date(2012, 0, 31); // Jan 31 (leap year)
dat2.setMonth(dat2.getMonth() + 1); // Mar 2
dat3 = new Date(2011, 11, 31); // Dec 31
dat3.setMonth(dat3.getMonth() - 1); // minus one month is Dec 1
dat4 = new Date(2011, 10, 30); // Nov 30
dat4.setMonth(dat4.getMonth() - 1); // minus one month is Oct 30
alert(dat0 + "\n" + dat1 + "\n" + dat2 + "\n" + dat3 + "\n" + dat4);
これを IE 9 と Chrome でテストしましたが、結果は同じです。したがって、すべての JavaScript 実装が同じ結果を生成すると仮定できますか? 言い換えれば、これらの結果は、合意された基準によって決定されますか?
(10 月 31 日に 1 か月足すと 12 月 1 日になることには驚きません。しかし、1 月 31 日に 1 か月足すと、3 月に 2 つの異なる日付が発生し、どちらの日付も 3 月 1 日にはなりません。)
このjsFiddleを参照してください。
関連メモ:興味のある方のために、オブジェクトが提供するclosure
ものを超えた追加の日付計算機能を処理するように設計された を書いています。Date
(月の加算/減算、2 つの日付間の月、月の最終日、うるう年など)Date
オブジェクトを (プロトタイプを介して) 拡張できることはわかっていますが、そうしない理由があります。いずれにせよ、addMonths
1 月 31 日に 1 か月を追加すると、常に 2 月の最終日が結果として返される関数があります。10 月 31 日に 1 か月を追加すると、11 月 30 日が返されます。
このjsFiddleを使用してコードを試すことができます。
コメント、質問、提案を歓迎します。