K-NOTE

スマホアプリ開発とかの備忘録

当ブログの内容等の正確性は保証しません。ご利用は自己責任で!

【JS】Date.setMonth()の罠

JavaScriptの日時を扱うDateオブジェクトにて、月を設定するsetMonth()メソッドの罠にはまりました。

4月2日に設定するため、下記のコードを書いたとします。

var dt = new Date();  // ①Dateインスタンス作成
dt.setMonth(4-1);     // ②4月に設定
dt.setDate(2);        // ③2日に設定


これを月末に実行すると、期待どおりに動作しません。

では、8/31に実行したとしましょう。
①では今日の日付となるので、「8/31」になる。
②で4月に設定しているので、4/31になるが、4月に31日は無いため、「5/1」となる。
③で2日に設定しているので、「5/2」になる。


このように、31日に31日が無い月(2,4,6,9,11)を設定しようとしても期待どおりにはならないのです。
もちろん2月に設定する場合は29・30日に実行してもダメです。


対策方法は2つ。
1つ目は、コンストラクタで設定する。

var dt = new Date(2014, 4-1, 2);


2つ目は、先にsetDate()で1日にしておく。

var dt = new Date();
dt.setDate(1);
dt.setMonth(4-1);
dt.setDate(2);