JavaScriptの日付オブジェクトの比較


86

Javascriptで日付オブジェクトを比較すると、同じ日付を比較してもtrueが返されないことがわかりました。

 var startDate1 = new Date("02/10/2012");
 var startDate2 = new Date("01/10/2012");
 var startDate3 = new Date("01/10/2012");
 alert(startDate1>startDate2); // true
 alert(startDate2==startDate3); //false

これらの日付の同等性をどのように比較できますか?Date日付を比較するためだけにサードパーティのJSを使用するのは適切ではないため、サードパーティのライブラリではなくJSのネイティブオブジェクトを利用することに興味があります。


15
これがJavaScriptでうまく設計されていないことの優れた例。
devios1 2012

回答:


131

これは、2番目のケースでは、実際の日付オブジェクトが比較され、2つのオブジェクトが互いに等しくなることはないためです。それらを番号に強制します:

 alert( +startDate2 == +startDate3 ); // true

より明示的に数値に変換する場合は、次のいずれかを使用します。

 alert( startDate2.getTime() == startDate3.getTime() ); // true

または

 alert( Number(startDate2) == Number(startDate3) ); // true

ああ、仕様への参照:§11.9.3オブジェクトを比較するときに基本的に言う抽象的な等式比較アルゴリズムobj1 == obj2は、それらが同じオブジェクトを参照している場合にのみ真であり、そうでない場合、結果は偽です。


5
@AndrewD。この特定のケースで厳密な等号を使用しても結果に違いはありません。これは、例の等号演算子が常に同じタイプのオペランドを処理しているためです。@ RobGは値を明示的に数値に変換しています(例1および3)または実施例2で、我々はそれが知っているDate.prototype.getTime、常に数...返します
クリスチャンC.Salvadó


2
@ Nick —最も遅いバージョンでも実行に1マイクロ秒未満かかるため、比較の違いはありますが、絶対的にはパフォーマンスの違いはごくわずかです。OPは、最適なアプローチを選択する必要getTimeがあります。わかりやすくするために、おそらく使用するのが最適です(そして、私がテストしたブラウザーでも最速です)。
RobG 2013年

2
@RobGあなたが知っている、あなたは絶対に正しいです。=)私はライブラリを書いていて、「ただの」テストをしました。実際のソフトウェアでは、何の違いもありません。
Nick Zalutskiy 2013年

1
@ Johannes- Javascriptで単項+が使用されるものを参照してくださいおよび単項+演算子
RobG 2014

24

getTime()エポックから返されるミリ秒数(つまり数値)を使用して日付を比較します。

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");
var startDate3 = new Date("01/10/2012");
alert(startDate1.getTime() > startDate2.getTime()); // true
alert(startDate2.getTime() == startDate3.getTime()); //true

またDate、文字列表現に依存するのではなく、明示的な年/月/日付番号を取得するコンストラクターの使用を検討してください(Date.parse()を参照)。また、JavaScriptの日付は、常にクライアント(ブラウザー)のタイムゾーンを使用して表されることに注意してください。


1
Date()への引数として文字列を使用することに関するコメントの+1。
RobG 2011

16

getTimeメソッドを使用する必要はありません。別の日付オブジェクトから日付オブジェクトを減算できます。ミリ秒の差を返します(秒が後の日付の場合は負)

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");

var diff= (startDate1 -startDate2)

//日付のタイムスタンプが同じ場合、0と評価されます


+1シンプルでエレガントなimo推奨ソリューション:これは、数値のタイムスタンプを強制することなく、組み込みの日付評価機能を使用します
gdibble 2016年

5

実際のミリ秒を比較できます。

alert(startDate2.getTime() === startDate3.getTime());

0

関数valueOf()を使用することもできます

 var startDate1 = new Date("02/10/2012").valueOf();
 var startDate2 = new Date("01/10/2012").valueOf();
 var startDate3 = new Date("01/10/2012").valueOf();
 alert(startDate1>startDate2); // 1326150000000 > 1328828400000   true
 alert(startDate2==startDate3); // 1328828400000 > 1326150000000  false
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.