【JavaScript】 同じ日付を比較しても一致してくれない

この記事は約4分で読めます。

コーディングのイメージ

こんにちは、さち です。

先日、JavaScript のコードを書いていて、『日付(日時)を比較して、一致したら◯◯をする』という機能を作りたかったのですが、上手く動きませんでした。

明らかに同じ日付なのに、比較をしても一致しないのです。

そこで今回は、JavaScript で日付を比較するときのコードの書き方について見ていきます。

スポンサーリンク

「日付」を比較しても一致しない

サンプルコード

まったく同じ日時の「日付オブジェクト」を2つ作って比較するコードを書きました。

//日付オブジェクトを作成する
let date1 = new Date(2022, 8, 12);
let date2 = new Date(2022, 8, 12);

console.log(date1);// => Mon Sep 12 2022 00:00:00 GMT+0900
console.log(date2);// => Mon Sep 12 2022 00:00:00 GMT+0900

//2つを比較する
let bool;
if(date1 === date2) {
  bool = true;
} else {
  bool = false;
}

console.log(bool);// => false

ご覧のとおり、明らかに同じ日時を設定したにも関わらず、比較した結果は「不一致bool には false が返ってきます。

なぜ一致しないのか

オブジェクトの比較で行われているのは、「内容(値)」の比較ではなく、オブジェクトが保存されている「メモリのアドレス(場所)」の比較です。

別々に作られたオブジェクトは、内容が同じであっても、保存されている「メモリのアドレス」が違います。だから、比較しても一致しないわけです。

例えると、『2人の「佐藤さん(オブジェクト)」がいても、「住んでいる場所(メモリのアドレス)」が違えば、同一人物ではない(一致しない)』みたいなことです。

この現象は、「日付オブジェクト」以外に、「配列」や「連想配列」などでも起きます。

ちなみに、下記のように「メモリのアドレス」が同じになる状況(3行目)にすれば一致しますが、今回のように別々のオブジェクトを比較したい場合には使えません。

//日付オブジェクトを作成する
let date1 = new Date(2022, 8, 12);
let date2 = date1;

console.log(date1);// => Mon Sep 12 2022 00:00:00 GMT+0900
console.log(date2);// => Mon Sep 12 2022 00:00:00 GMT+0900

//2つを比較する
let bool;
if(date1 === date2) {
  bool = true;
} else {
  bool = false;
}

console.log(bool);// => true

「タイムスタンプ」で比較すれば良い

「日付オブジェクト」が比較できないのであれば、「タイムスタンプ」を取得して、それを比較すればOKです。

//日付オブジェクトを作成する
let date1 = new Date(2022, 8, 12);
let date2 = new Date(2022, 8, 12);

//タイムスタンプを取得する
let time1 = date1.getTime();
let time2 = date2.getTime();

console.log(time1);// => 1662908400000
console.log(time2);// => 1662908400000

//2つを比較する
let bool;
if(time1 === time2) {
  bool = true;
} else {
  bool = false;
}

console.log(bool);// => true

分かってしまえば単純なことですが、実際には何行もあるコードの一部なので、不具合の原因を見つけるのに苦労しました……。

「タイムスタンプ」は、1970年1月1日から何ミリ秒経過したかを意味する数値です

コメント

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