JavaScript 日期比较不等于



我试着搜索有类似问题的人,但没有找到任何东西。

我在JavaScript中有两个日期,都设置为相同的值…相等性测试在==上失败,但是>=和<=评估为真。

下面是我在玩的代码:

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上读过一篇关于类似问题的文章,一个人说日期对象可以像其他对象一样进行比较,我发现的任何其他例子都是<或>类型的比较,从来没有一个完全的相等,所以我不能建立连接,为什么我做错了。

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

当您使用<=>=来比较两个日期对象时,它们将通过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

我想如果你这样做

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

EDIT修复以上代码

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

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]])。只是不要使用==。永远。这是"信息面板"。Fullstop .

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

最新更新