2011-08-30 101 views
39

我试过寻找有类似问题的人,但还没有找到任何东西。JavaScript日期比较不等于

我在JavaScript中有两个日期,都设置为相同的值... Equality Testing在==上失败,但> =和< =评估为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上的一篇文章,一个家伙说,日期对象可以像任何其他的比较,我发现任何其他例子总是做了<或>类型的比较,从来没有一个完整的平等,所以我无法确定我为什么做错了。

感谢你们两位以及其他发布类似答案的人。

回答

75

当您使用<=>=来比较两个Date对象固定,它们通过valueOf相比,这是一样的getTime的日期。

但是当你使用==时,它们是同一类型的两个不同的对象,所以它返回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的许多不合理的部分之一。您可以解决此问题的日期转换为使用.getTime()将返回多少毫秒自该日和1月1日的00:00:00通过多项,1970年

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

===操作上的对象它们本身将总是返回false,因为这两个对象确实是不同的可变JavaScript对象。

PS:请勿在Javascript中使用==运算符。永远。它将“疯狂”这个词带到了一个全新的高度。认真。问题在于,所有类型的转换都是毫无意义的,例如,您最终得到"1"==1,x==false && (x?1:2)==1或甚至a==b && b==c && a!=c为真(例如x=[]a=[1], b=1, c=[[1]])。只是不要使用==。永远。这是“FUBAR”。句号。

+0

我大多使用PostScript同意,但它应该这样来支持更有意义,这样的+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>