【javascript】日付の判定について


javascriptで日付を判定する方法のメモ


 


 


日付の判定で一番簡単なのは、
大小記号やイコールを2つ連続しての、一般的な数値比較と同様の記述による比較であり、
Dateオブジェクト同士を<や>で比べることができる。

var date1 = new Date(2018,2,14,18,59,58);  
var date2 = new Date(2018,2,14,18,59,59);  
alert('date1 < date2 =' + date1 < date2);  


一方で、Date#getTime()を使って比較することもできる。

var date1 = new Date(2018,2,14,18,59,58);  
var date2 = new Date(2018,2,14,18,59,59);  
alert('date1#getTime() < date2#getTime() =' + date1.getTime() < date2.getTime());  


なお、最初のやり方では、
同じ日付・時刻を指している場合でも、==の判定が正しく動作しない(結果がfalseになる)。
これは”オブジェクトとしては違う(参照先が異なる)”と判断されているためである。
Dateオブジェクト同士を比較する場合は<か>を使うようにしたほうがいい。
(==だけ違う意味合いの比較になる、という意味)

例えば以下のような3つのDateオブジェクトを用意して、↑に記載した3つのやり方で判定してみると

変数名コンストラクタ備考

date1 new Date(2018,2,19,18,50,20,100);  
date2 new Date(2018,2,19,18,50,20,100); date1とミリ秒単位で完全同じ日付オブジェクト
date3 new Date(2018,2,19,18,50,20,101); date1より1ミリ秒遅い(未来の)時刻を指す

 

No比較式結果

1 date1 == date2 false
2 date1 < date2 false
3 date1.getTime() == date2.getTime() true
4 date1.getTime() < date2.getTime() false
5 date1 == date3 false
6 date1 < date3 true
7 date1.getTime() == date3.getTime() false
8 date1.getTime() < date3.getTime() true


となる。
この場合、No.1は、「全く同じ日付と時刻を持った別オブジェクト同士の比較」となり、
日付と時刻は一緒なのだがオブジェクトが違うという意味で結果はfalseになる。
正確に日付と時刻を比較するならgetTimeでの比較(No.3)が必要となる。

なお、1ミリ秒でもずれていれば(date1とdate3の例のように)、
getTimeを使わずともDateオブジェクト同士を<や>で結べばちゃんと大小を判定してくれる。

「日付(や時刻)を比較する」という点において、
オブジェクトの同値性を度外視して
正確に日付や時刻の大小関係や等価性を評価するなら
素直にgetTime()で比較したほうがいいのだろう。