はじめに:JavaScriptでつまずいた日付の罠
Excelのマクロ ⇒ python ときて、最近JavaScriptを趣味で触り始めました。日曜大工ならぬ日曜プラグラマーを楽しんでいます。
触り始めたJavaScriptで直面したのが「1月が0月扱いされる」という仕様。PythonやExcel VBAとは異なり、日付処理で思わぬ落とし穴がありました。
結論から言うと、「JavaScriptでは1月は0で12月は11」です。
JavaScriptの日付処理は「月=0始まり」
以下のコードをご覧ください。
今日の日付を出力するコードです。
var today_date = new Date();
var year = today_date.getFullYear();
var month = today_date.getMonth(); // ← ここがポイント
var day = today_date.getDate();
var weekday = today_date.getDay();
document.write("今日は" + year + "年" + month + "月" + day + "日です<br>");
document.write("曜日は" + weekday);3これを2023年2月2日に実行すると、出力結果は:
今日は2023年1月2日です
曜日は4
1月が「0」、2月が「1」扱いになるため、出力上は1月と表示されてしまいます。
対策としては、以下のように+1する必要があります。
var month = today_date.getMonth() + 1;なぜ月が0始まりなのか?
調べてみると、JavaScriptでは「曜日も日曜が0」という仕様のため、月も配列のように0始まりで統一されているとのこと。
例:
var months = ["Jan", "Feb", ..., "Dec"];
months[0] // Janなるほど配列的な設計思想ですね。
他の言語ではどうなっている?
プログラミング言語ごとの「月」「曜日」「日付」の扱いをまとめまてみました。
月に関しては比較的新しい?今風?の言語は、1~12(python、Ruby、PHPなど)、伝統ある言語は0~11(C言語、JAVA)という感じでしょうか。
曜日に関しては、もうバラバラです。JAVAは月は0から始まるのに曜日は1から始まるようです。
| 言語 | 月の扱い | 曜日の扱い | 日付 |
|---|---|---|---|
| JavaScript(date) | 0~11 | 0=日曜~6=土曜 | 1~31 |
| Python (datetime) | 1~12 | 0=月曜~6=日曜 | 1~31 |
| C言語 (tm構造体) | 0~11 | 0=日曜~6=土曜 | 1~31 |
| Java (Calendar) | 0~11 | 1=日曜~7=土曜 | 1~31 |
| Ruby (Date) | 1~12 | 0=日曜~6=土曜 | 1~31 |
| PHP (DateTime) | 1~12 | w=0~6(日曜始まり) N=1~7(月曜始まり) | 1~31 |
| SQL (DATETIME) | 1~12 | 1=日曜~7=土曜(MySQL) | 1~31 |
| Perl (DateTime) | 1~12 | 1=月曜~7=日曜 | 1~31 |
結論:慣れるまでは混乱必至。でも慣れます。
1月が「0」だったり「1」だったり、曜日が「0=日曜」だったり「1=月曜」だったり……言語ごとに仕様がバラバラで、初心者は混乱しがち。
でも結局のところ、
「その言語がそう設計されているからそうなっている」
という話。慣れが大切です!
まとめ
- JavaScriptでは月は0始まり(0=1月、11=12月)、曜日は0=日曜~6=土曜
- PythonやRubyなど多くの言語は月は1~12で扱う
- 曜日や月の扱いは言語ごとに仕様が違うため、都度確認が大事!
おまけ:プロでも混乱しますよね?
複数言語をまたいで開発しているエンジニアの皆さん、本当にお疲れ様です。
筆者のような「日曜プログラマー」ですら混乱するんですから、プロはもっと大変ですよね……!


コメント