JavaScript の日付について

2020年7月19日 engineering

こんにちは、 @kz_morita です。

最近 Web フロントの実装をすることが多いのですが,JavaScript の日付についてちょっと躓いたことがあったのでまとめます.

JavaScript の日付型

JavaScript では,Dateクラスを用います.

MDN web docs - Date

Data の生成は以下のように行います.

const date1 = new Date('2020-01-02T03:45:00Z');
const date2 = new Date(2020, 1, 2, 3, 45);

一見すると,両方とも 2020年 1月2日 3時45分 を指しているようですが,実は異なります.

date1 は 2020年 1月2日 3時45分 ですが,data2 は 2020年 2月2日 3時45分 を指します.

JavaScript の Date では,月 (month) は 0 ~ 11 の数値で指定します.

この仕様に気づかなくて,月が1ヶ月ずれるという不具合がありました.

ちなみに,上記の date1, date2 に対して Date.prototype.getMonth() メソッドを呼ぶと結果は以下のようになります.

const date1 = new Date('2020-01-02T03:45:00Z');
date1.getMonth(); // 0 (1月)

const date2 = new Date(2020, 1, 2, 3, 45);
date2.getMonth(); // 1 (2月)

おそらく,月を,Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec のように表すときに,配列のindex のような扱いをするために便利だったのだと推測できますが,日本のような年月の表示形式だととても混乱する仕様になっているかと思いますので,注意が必要です.

まとめ

JavaScript のDate型における月の扱いについて簡単にまとめました. 多分 FrontEnd の開発を日頃から行っている人にとっては割とよく知れた問題なのかなとは思いますが,久しぶりに触ったら一瞬戸惑ってしまいました.

この記事をシェア