JavaScriptのnew Date()コンストラクタにはマイナスも指定可能

ソースレビュー中に驚く記述がありました。

var year = 2017;
var month = 2;
var day = 22;
var d = new Date(year, month-3, day); // 3ヶ月前

いやこれ、月がマイナスになる場合は落ちるんじゃないか、と思いました。

 

ところが、実際に動かしてみるとこうなります。

 

ちゃんと今日から3ヶ月前の日付になっていると思います。

 

Mozillaの開発者向け情報にJavaScriptのDateの仕様か記載されています。

Date - JavaScript | MDN

ほかの技術ブログなどでもそうですが、monthには0~11、dayには1~31が指定可能と記載されています。

ブラウザの実装に依存する形ではありますが、主要ブラウザではいずれも正常に動作しています。

 

以下は実際に動かしてみた各コンストラクタの内容です。思ったよりいろいろと指定できるようです。

コンストラク引数引数の例出力される内容備考
new Date() (引数無し) (引数無し) 現在の日付  
new Date(long) MilliSeconds 946652400000 1900/1/1 00:00:00から経過したミリ秒  
new Date(int) year 2013 入力した年数の1月1日(世界標準時)  
new Date(String) dateString 2017/02/22
2017/2/22
2017-02-22
2017/2/22 21:15:9
入力した文字を日付にしたもの スラッシュ(/)区切りなら1桁は0が不要
ハイフン(-)区切りなら必ず2桁必要
Date.parse()で解析できる文字列ならOK
new Date(int, int) year, month 2017, 02 入力した年数、月の1日 mmにはマイナスも指定可能。指定した場合、-1ならyyyy-1の12月
new Date(int, int, int) year, month, day 2017, 02, 22 入力した年数、月、日の00:00:00 mm、ddにはマイナスも指定可能。mmが-1ならyyyy-1の12月、ddがマイナス-1ならyyyy-1、mm-2の末日
new Date(int, int, int, int) year, month, day, hour 2017, 02, 22, 21 入力した年数、月、日のhh:00:00 hourにもマイナス指定が可能。hourがマイナスなら↑の年月日の前日23時
new Date(int, int, int, int, int) year, month, day, hour, minute 2017, 02, 22, 21 入力した年数、月、日のhour:00:00 minuteにもマイナス指定が可能。minuteがマイナスなら↑の年月日の時間から1分引いた時刻
new Date(int, int, int, int, int, int) year, month, day, hour, minute, second 2017, 02, 22, 21, 36, 29 入力した年数、月、日のhour:minute:second secondにもマイナス指定が可能。secondがマイナスなら↑の年月日の時間から1秒引いた時刻