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);