先日の勉強会で、「日付系のライブラリで月の情報を取得すると、月が0から始まる変わった仕様」という話があがったのですが、誰しもが1度は不思議に思ったことがあると思います。
「なんで日は1から始めるくせに月は0からなんだ!」って気持ちになるのですが、私が勝手に想像していることとして、月を数字で表すっていう文化はそれほど世界共通の認識ではないんじゃないでしょうか?
月の呼び方
日本語文化では1年の最初の月は1月で最後は12月。月と数が密接ですが、英語圏ではJanuaryとDecemberです。そして英語文化で生きていると想像してください。
プログラミング言語で月のデータを表現するためにプログラミング言語らしくゼロオリジンでJanuary=0, February=1…と割り当てられるのは自然です。日付(1-31)はもともと数と密接に表現されていた文化ですからそのまま1から始めます。月と数が密接でない文化からすると、月にどんな数字を割り当てようと現実世界との違和感はあまりないわけです。
日本でも昔は睦月、如月、弥生って読んでたわけで、その文化で生きていればコンピュータに都合のいいように睦月=0, 如月=1でも違和感なかったのではないでしょうか。
じゃあ英語圏ではJanuary=0な考えなのか?というとそうではないと思います。やっぱり1でしょう。ただ日本ほど月と数が密接ではないのかなと。
曜日での感覚
例えば曜日は日月火…土と数に結びついていません。(日曜から始まるか月曜から始まるかという別の問題はありますが、ここでは日曜始まりとして)「木曜日を数で表すといくつ?」って言われてパッと4と思い浮かびませんよね。曜日が数と結びついてないのです。曜日を数で表現するのに現実世界の曜日とのしがらみがあまり生まれません。そうなるとコンピュータに都合のいいようにゼロオリジンにしたくなりますよね。
でももし別のある国の言語で曜日の呼び方が第1曜日、第2曜日だったら、「なんで第1曜日=0なんだよ!」って違和感が生まれますね。
2014/03/17追記: きしださんのコメントから、中国語では月曜日は星期一、火曜日は星期二だそうで、日曜は7っぽい感じなので「なんで日曜7じゃなくて0なんだよ!」って思ってるかもしれませんね。
まとめ
まあ共通認識として一般的じゃなかったとして、じゃあ「一般認識が定まってなかったら定めようよ!」って決めようとしたならどうするべきか?とかんがえると、やはりJanuary=1月=1となるべきだったと思いますが、なんとなく0になってしまったのもわからないでもないよねって思ったわけで。
ちなみにしらべてみたら、C言語のstruct tmに由来してそうなのは多分みんな1月=0なんでしょうが、.NET Frameworkは1〜12なんですね。DateTime.Month プロパティ (System)
中国語だと月曜日は星期一、火曜日は星期二なので、月曜日が0だと怒られるでしょうね。
日曜日は星期天か星期日なので0としてもいい気がするけど、星期七ということもあるので、違和感ありそう。
なるほど!実際に曜日を数字で表す文化があるとは(こんなに身近に)知りませんでした!
中国語文化だと月曜始まりの1オリジンってあたりが自然なのでしょうかね。