🗓️

JavaScriptのDateはなぜ月を0から数えるのか?仕様の背景と対策を調べてみた

に公開
console.log(new Date(2025,5,17));
// Mayではないことに最初は驚くと思います
Tue Jun 17 2025 00:00:00 GMT+0900 (日本標準時)

上記のように、JavaScriptで月を指定する際、
なぜ1から12ではなく0から11で表すのかふと疑問に思ったので調べてみました。

MDNを見てみる

Dateオブジェクトに関するMDNのページを見てみたものの、なぜ1からではなく0から始まっているのかということに言及するような記載はありませんでした、、、

getMonth()のページも見てみたが同様でした、、、
言語仕様を説明するドキュメントなので書かれていなくても仕方ないのかもしれませんが、、、

Brendan Eich(JavaScriptを作った人)のコメント

https://x.com/BrendanEich/status/481939099138654209?ref_src=twsrc^tfw|twcamp^tweetembed|twterm^481939099138654209|twgr^f8fce2cf5989c329c6b7cb640e07f19e577ba442|twcon^s1_c10&ref_url=https%3A%2F%2Ftech.kurojica.com%2Farchives%2F48276%2F

JavaのDateを真似したと述べています。

※現在は非推奨となり、新たに推奨されているLocalDateでは月は1〜12で表現され、直感的になっています。

月を0〜11で表すのは直感的でなく、仕様としてイケてないと感じたのだと推察します、、、

まとめると、以下のようになります。

  • JavaScriptを設計した際のJavaの仕様が引き継がれたと言う背景がある。
  • JavaScriptに引き継がれたJavaの仕様はJava側では変更されたが、JavaScript側ではそのまま

JavaScriptでの対策

Day.jsを使って直感的にする方法が一般的かと思います。
※月のズレを気にせず直感的に扱えるのがわかると思います。

import dayjs from 'dayjs';

const date = dayjs('2025-05-17')
// '2025-05-17'と出力されるはず。
console.log(date.format('YYYY-MM-DD'));

Discussion