読者です 読者をやめる 読者になる 読者になる

BattleProgrammerShibata

ある日は誰かと戦い、ある日は何かと戦い、そしてある日は自分と戦うのだろう、そういう生き物。

なんで日付の月って0で始まるのって話

ある日の A さんとの会話。

A「JavaScript の日付の扱いで月だけは0から始まるのなんでですか?」
僕「あー…。なんでだろう」
A「やっぱり JavaScript ってクソっすね wwwwwww」
僕「……」

f:id:bps_tomoya:20150521232912j:plain


JavaScript の Date オブジェクトから取得できる月情報が0から始まるのはわりと有名な話で…。
…いやいや、そんなのは JS に限ったものではないはずだ。

ともかく、恥ずかしながらその理由をキチンと知っているわけでも無かった。 というわけで、ここら辺の経緯をほんの軽くだけど探ってみた。


日本であれば月のことを数えるとき、「1月、2月、3月…12月」というように数字で表現する。
一方、英語圏のばあい、「January, February, March, ... December」と表現する。

中学英語のような話だが、「1 st, 2 nd, 3 rd ... 12 th」などではないということだ。
もちろん表記の際には数字で記述するが、先のように発音されるだろう。

調べていく中で Stackoverflow などのコメントでは、

「月は数字ではない! 月は数字ではない! 月は数字ではない!」

という意見を沢山目にした。(洗脳されそうだった)

この方式を取り入れたのは C 言語が始まりのようで、後続言語がそれにならい、さらにその後続言語が…といった経緯を辿ったようだ。 各々の月の名前を配列に入れたのだから、0から始まるのはおかしくない。という認識でよいだろうか。

しかし残念なことに我が国日本では月を数字で表現する。


ここで別言語に視点を切り替えてみた。例えば Java 8 の TimeAPI の仕様を見てみると、java.time.Month には各月の名前が列挙型で定義されている。

http://docs.oracle.com/javase/jp/8/api/java/time/Month.html

一部抜粋。

各月には、テキストの列挙名の他にint値もあります。このint値は、通常の使用法およびISO-8601標準に準拠して、1(1月)-12(12月)になります。コードをわかりやすくするために、アプリケーションはint値ではなく列挙型を使用することをお薦めします。

この一文に今日までの様々なエンジニアの思いが集約されているように思える。
getValue メソッドを使うと、1 から 12 までのいずれかの値が取れるようだ。

うーむ。


JavaScript に戻ってみる。Date を直に触ることをやめて、日付操作ライブラリの moment.js を使ってみよう。

moment().month();  // 整数型"4" が出力される
moment().month(5); // 5月がセットされる

moment().set('May');   // 5月がセットされる
moment().format('M');  // 文字列型"5"が出力される 
moment().format('MM'); // 文字列型"05"が出力される

moment.js で描画用の月値を取得したいときは、format に統一したほうがよさそうだ。


数字による月の呼び方などやめてしまい、いっそのこと、日本を感じられる月の名前の呼び方にしてみてはどうだろう。

そうだな、「睦月」「如月」「弥生」という先進的な名前は如何か。

うん、これは発明だ。