【JavaScript】1月は0?プログラミング言語によって異なる月と曜日の扱いに注意!

テーマはプログラミング言語での月と曜日の扱い 日常の話

はじめに: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~110=日曜~6=土曜1~31
Python (datetime)1~120=月曜~6=日曜1~31
C言語 (tm構造体)0~110=日曜~6=土曜1~31
Java (Calendar)0~111=日曜~7=土曜1~31
Ruby (Date)1~120=日曜~6=土曜1~31
PHP (DateTime)1~12w=0~6(日曜始まり)
N=1~7(月曜始まり)
1~31
SQL (DATETIME)1~121=日曜~7=土曜(MySQL)1~31
Perl (DateTime)1~121=月曜~7=日曜1~31

結論:慣れるまでは混乱必至。でも慣れます。

1月が「0」だったり「1」だったり、曜日が「0=日曜」だったり「1=月曜」だったり……言語ごとに仕様がバラバラで、初心者は混乱しがち。

でも結局のところ、

「その言語がそう設計されているからそうなっている」

という話。慣れが大切です!


まとめ

  • JavaScriptでは月は0始まり(0=1月、11=12月)、曜日は0=日曜~6=土曜
  • PythonやRubyなど多くの言語は月は1~12で扱う
  • 曜日や月の扱いは言語ごとに仕様が違うため、都度確認が大事!

おまけ:プロでも混乱しますよね?

複数言語をまたいで開発しているエンジニアの皆さん、本当にお疲れ様です。
筆者のような「日曜プログラマー」ですら混乱するんですから、プロはもっと大変ですよね……!

コメント

タイトルとURLをコピーしました