JavaScript 日期比较不等于

IT技术 javascript date equality
2021-03-12 08:21:47

我试过寻找有类似问题的人,但没有找到任何东西。

我在 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 上阅读过一篇关于类似问题的早期帖子,有人说日期对象可以像任何其他对象一样进行比较,而我发现的任何其他示例总是进行 < 或 > 类型的比较,从来没有完全相等,所以我无法就我做错的原因建立联系。

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

5个回答

当您使用<=>=比较两个日期对象时,它们通过 进行比较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()方法将日期作为整数返回,您在那里所做的是比较对象,而不是特定值。

编辑修复了上面的代码

@Shef 只​​有大约 50 秒,我会为你的麻烦给你 +1 ;-)
2021-05-08 08:21:47

这是 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是 true 的结果(例如 withx=[]或 with a=[1], b=1, c=[[1]])。只是不要使用==. 曾经。是“福巴”。句号。

@MichaelScheper:我同意那篇文章对许多据称有效的用例进行了很好的分析,但我认为重要的是还指出为什么它可能非常危险(即它==不是可传递的,或者你可以拥有x == falsex真实) .
2021-04-24 08:21:47
我大多同意后记,但它应该得到更有意义的支持,例如:2ality.com/2011/12/strict-equality-exemptions.html
2021-05-08 08:21:47
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>