【日付の比較】同じ日って==でできない?時間は省ける?Javascript初心者の勉強

日付の比較をしていましたが同じ日付の比較でつまずいたので備忘録です。

日付の比較は==でできるが工夫が必要

日付の比較を例えば以下のように行ってみましたがうまくいきませんでした。

var date1 = new Date(2021, 1, 1);
var date2 = new Date(2021, 1, 1);
console.log(date1==date2); // false

同じ日付、時間なのにtrueになってくれない。
どうやら日付を比較しているのではなく、参照値を比較しているようです。
同じ参照ではないので、同じ参照じゃないよとfalseになってしまっているようです。

ではどのように日付を比較するのでしょうか。

日付はgetTime()で比較できる!

純粋に値を比較するには日時を取得するgetTime()を使って値を比較します。getTime()だと1 January 1970 00:00:00 UTC (世界協定時 - 1970年1月1日 0時0分0秒)からの経過ミリ秒の数値を比較することができます。

日付を比較 サンプルコード

var date1 = new Date(2021, 1, 1);
var date2 = new Date(2021, 1, 1);
console.log(date1.getTime()===date2.getTime()); // true

new Date(2021, 1, 1) のように日付まででnew Date()した場合、時間は0時0分00秒に設定されます。

時間を除く日付の比較はどうする?

ではもし以下の値で日付を比較したい時はどうなるでしょうか。

var date1 = new Date(2021, 1, 1, 01, 30, 45);
var date2 = new Date(2021, 1, 1);
console.log(date1.getTime()===date2.getTime());

結果は「false」となります。時間を含めて比較しているからです。
それでは日付だけで比較するにはどうしたら良いでしょうか。
さくっと答えを書くと以下のメソッドを利用し年、月、日とそれぞれ比較してあげます。

  • getDate() 日を戻す
  • getMonth() 月を戻す
  • getFullYear() 年を戻す

時間を除く日付の比較サンプルコード

var date1 = new Date(2021, 1, 1, 01, 30, 45);
var date2 = new Date(2021, 1, 1);
console.log(date1.getFullYear() === date2.getFullYear() &&
date1.getMonth() === date2.getMonth() &&
date1.getDate() === date2.getDate()); // true

ちょっと面倒ですね。

おまけ

getTime()で現在の日付と入力した値を比較するサンプルコードを作ってみました。

See the Pen 現在日の比較 by Nakamoto (@programmerlife) on CodePen.

おわり

わかってしまえばなんてことはないのですが、==で比較ができないと思考が止まってしまいました。
参照を比較しているという発想にたどり着きたかったな。まだまだですね。
いい勉強になりました。

参考

How to check if two dates are the same day in JavaScript

Javascript

Posted by Nakamoto