なぜJavaScriptのgetMonthは0-indexなのか

date型の変数においてgetMonth()を用いて取得できる月の数字は1~12ではなく0~11である。
このことは前から知っていたが、なぜこのような間違いが生じやすい状態になったのか突然気になったので少し調べてみた。

Cのlocaltimeにみられるように伝統的に備わっている

https://linux.die.net/man/3/localtime このページに記載されているtm_monThe number of months since January, in the range 0 to 11.と書いてある。確かに12個ある要素に番号を振るとしたら0から番号を振るのが自然にも思えてくる。
曜日に感しても月と全く同様の定義がなされているのだが、我々は曜日に1,2…などの番号を振ることをしないためこちらはそれほど違和感なく受け入れられる傾向にあるのかもしれない(そもそも日曜始まりか月曜始まりかで決まっていないくらい数字には縛られていない)。

JavaScriptを作った方のコメント

JavaScriptの生みの親、Brendan Eichさんはリプライの中で上のように述べている。JavaScriptはJavaのjava.util.Dataの構造に着想を得ていて、その実装を元にJavaScriptのDate型を定義したという。
「JavaとJavaScriptはインドとインドネシア、いやメロンとメロンパンくらい違う」とかよく例えられるが実際は割と似ている部分もあるのかもしれない。

とにかく、0-indexであることはもう仕方がないので実装時に実際の0-indexの値と1-indexの表示用を混ぜないようなわかりやすいコードを書くことが大事そうだなと思った。