こんにちは、さち です。
先日、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
分かってしまえば単純なことですが、実際には何行もあるコードの一部なので、不具合の原因を見つけるのに苦労しました……。
コメント