JavaScript日期比较不相等

71

我曾试图寻找类似问题的解答,但没有找到。

我的JavaScript中有两个日期,两个日期都被设置为相同的值...使用 == 进行相等测试失败,但是 >= 和 <= 却返回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上读到一个类似问题的早期帖子,一个家伙说日期对象可以像其他任何对象一样比较,而任何其他例子都是使用<或>类型的比较,从未进行完全相等的比较,因此我无法明白为什么我做错了。

感谢你们两个,以及其他给出类似答案的人。

5个回答

135

当您使用<=>=比较两个日期对象时,它们将通过valueOf进行比较,这与Date的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

54

我认为如果你这样做

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() 方法将日期作为整数返回,您在那里所做的是比较对象而不是特定值。

编辑 修正上面的代码


@Shef 只需要大约50秒,我会因此给你一个+1来表示感谢;-) - DaveRandom

21

这是JavaScript的许多不合逻辑的部分之一。您可以通过使用.getTime()将日期转换为数字来解决此问题,它将返回从那个日期到1970年1月1日00:00:00经过了多少毫秒。

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

===运算符作用于对象本身时,始终返回false,因为这两个对象确实是不同的可变JavaScript对象。

提示:永远不要使用Javascript中的==运算符。它所做的让“疯狂”一词达到了一个全新的水平。问题在于它应用各种根本没有意义的类型转换,例如你最终会得到像"1"==1x==false && (x?1:2)==1或者a==b && b==c && a!=c这样的东西为真(例如x=[]a=[1],b=1,c=[[1]])。永远不要使用==。它很糟糕。完结撒花。


我基本上同意这篇后记,但它应该有更有意义的支持,比如这个链接:http://www.2ality.com/2011/12/strict-equality-exemptions.html - Michael Scheper
@MichaelScheper:我认为该文章对许多被认为是有效的用例进行了很好的分析,但也很重要指出为什么它可能非常危险(例如==不是可传递的,或者您可以有x == falsex是truthy的)。 - 6502

8
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 />');

-3
<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接