2011-08-30 35 views
39

私は同様の質問をした人を検索しようとしましたが、何も見つかりませんでした。JavaScriptの日付の比較Do not Equal

JavaScriptで2つの日付があり、どちらも同じ値に設定されています...等価性テストは==で失敗しますが、> =と< = trueと評価されます。以下は

私が遊びに持っているコードです:

var startDate = new Date(2011, 7, 30, 0, 0, 0, 0); 

var dt = new Date(2011, 7, 30, 0, 0, 0, 0); 

if(startDate == dt) 
    document.write('They Equal<br />'); 

if(startDate > dt) 
    document.write('Start Date is > dt<br />'); 

if(startDate >= dt) 
    document.write('Start Date is >= dt<br />'); 

if(startDate < dt) 
    document.write('Start Date is < dt<br />'); 

if(startDate <= dt) 
    document.write('Start Date is <= dt<br />'); 

if(dt == startDate) 
    document.write('They Equal<br />'); 

if(dt > startDate) 
    document.write('dt > startDate<br />'); 

if(dt >= startDate) 
    document.write('dt >= Start Date <br />'); 

if(dt < startDate) 
    document.write('dt < Start Date <br />'); 

if(dt <= startDate) 
    document.write('dt <= Start Date <br />'); 

document.write(dt); 
document.write('<br />'); 
document.write(startDate); 

誰もがこのようなものが発生したか、私は根本的に間違って何かをやっていますか?

私はこれがInternet Explorer(9)、Firefox 5+、およびChromeであることをテストしました。

更新:

だから、二人は私の問題に大きな答えを掲示し、私はあなたの両方の感謝:xdazzとDaveRandomを。私は同様の質問stackoverflow.com上の記事を読んでいたと男は日付オブジェクトは他のすべてのように比較することができる、と私はいつも<または比較のタイプを見つけた他の例を比較することができる、なぜ私が間違っていたのかを知ることができませんでした。

おかげさまで、2人と同様の回答を投稿した他の人に感謝します。

答えて

75

上方に固定

EDITあなたが2つのDateオブジェクトを比較する<=>=を使用する場合、それらは日のためにgetTimeと同じであるvalueOf、経由して比較されます。

しかし、==を使用すると、それらは同じタイプの2つの異なるオブジェクトであるため、falseを返します。

は、いくつかの例を追加しました:

> new Date(2011, 7, 30, 0, 0, 0, 0) == new Date(2011, 7, 30, 0, 0, 0, 0) 
false 
> new Date(2011, 7, 30, 0, 0, 0, 0).getTime() == new Date(2011, 7, 30, 0, 0, 0, 0).getTime() 
true 
> new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() == new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() 
true 
> new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() == new Date(2011, 7, 30, 0, 0, 0, 0).getTime() 
true 
38

私はあなたのスクリプトの先頭に

var startDate = (new Date(2011, 7, 30, 0, 0, 0, 0)).getTime(); 
var dt = (new Date(2011, 7, 30, 0, 0, 0, 0)).getTime(); 

をすれば、あなたはそれが動作を見つけると思います。

getTime()メソッドは日付を整数として返します。特定の値ではなくオブジェクトの比較が行われています。コード

+0

@Shefのみ約50秒によると、私はあなたの悩み;-) – DaveRandom

7
var startDate = new Date(2011, 7, 30, 0, 0, 0, 0); 

var dt = new Date(2011, 7, 30, 0, 0, 0, 0); 

if(startDate.getTime() == dt.getTime()) 
    console.log('They Equal<br />'); 
8

これはJavascriptの多くの非論理的な部分の1つです。あなた1月1日の日付と〇時00分00秒から渡されたどのように多くのミリ秒単位で返します.getTime()を使用して数値に日付を変換することによって、この問題を回避することができ、1970年

if (a.getTime() === b.getTime()) ... 

オブジェクト上===オペレータそれらの2つのオブジェクトは実際には異なる可変JavaScriptオブジェクトであるため、常にfalseを返します。

PS:==演算子をJavascriptで使用しないでください。これまでそれは全く新しいレベルに "クレイジー"という言葉を取ります。真剣に。問題は、単純に意味が成り立たないすべての種類の型変換で、たとえば"1"==1,x==false && (x?1:2)==1、またはa==b && b==c && a!=cなどの場合(例:x=[]またはa=[1], b=1, c=[[1]]の場合)になります。 ==を使用しないでください。これまでそれは "フーバー"です。フルストップ。

+0

私はほとんど追伸に同意するが、それはこのように、はるかに有意義なものでサポートされなければならないための+1をあげます:http://www.2ality.com/2011/12/strict-equality-exemptions.html –

-2
<Script> 
function checkval() 
{ 
var strfromdate=document.frmadmin.txtfromdate.value; 
strfromdate=strfromdate.split("/"); 
//alert(strfromdate[2]+" "+strfromdate[0]+" "+strfromdate[1]); 

var strtodate=document.frmadmin.txttodate.value; 
strtodate=strtodate.split("/"); 

var fromDate = (new Date(strfromdate[2], strfromdate[0], strfromdate[1], 0, 0, 0, 0)).getTime(); 
var toDate = (new Date(strtodate[2], strtodate[0], strtodate[1], 0, 0, 0, 0)).getTime(); 
//alert(fromDate+" "+toDate); 



    if(toDate<fromDate) 
    { 
     alert("To date should be greater than from date."); 
     document.frmadmin.txttodate.focus(); 
     return false; 
    } 


    return true; 
} 
</Script>