JavaScript

年に数日だけ発現する日付の自動補正を発端とした罠

More than 3 years have passed since last update.

JavaScriptではよくあるこんな罠があります。


2015/4/1のDateオブジェクトを作ろうとするバグを含むコーディング例

var d = new Date();

d.setFullYear(2015);
d.setMonth(3); // 0オリジンで4月
d.setDate(1);
d // Fri May 01 2015 … 5月になっている

ちょうど投稿日の2015/3/31のような日付で実行すると再現するのですが、

3行目のsetMonthの所で2015/4/31になり、即時補正されて2015/5/1になります。

特定の日時が欲しい時はコンストラクタを使うか、先にsetDate(1)としておくのが無難そうです。

JavaScriptに限らずsetMonthnext monthといった単語が目に入ったら「もし31日に実行したら…」と想像する癖をつけるのが良いと思います。

日付の自動補正関係は時限爆弾になるので気をつけたいですね。

罠についてはこちらも参考になります。

JavaScript の Date は罠が多すぎる - Qiita

コンストラクタに文字列を与える時のブラウザ間の差異はこちらが参考になります。

Dateオブジェクト (日付と時刻) | JavaScript プログラミング解説