JavaScript日期比较不等于

Pat*_*ick 52 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 );
Run Code Online (Sandbox Code Playgroud)

有没有人遇到这样的事情,或者我做了一些根本错误的事情?

我测试的是Internet Explorer(9),Firefox 5+和Chrome.

更新:

所以两个人对我的问题发表了很好的答案,我感谢你们两个:xdazz和DaveRandom.我在stackoverflow.com上读过类似问题的早期帖子,并且有人说日期对象可以像其他任何人一样进行比较,而我发现的任何其他例子总是进行<或>类型的比较,从来没有完全平等所以我我无法确定为什么我做错了.

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

xda*_*azz 101

当您使用<=>=比较两个日期对象时,它们将通过比较valueOf,与getTimeDate 相同.

但是当你使用==它们时,它们是同一类型的两个不同的对象,所以它返回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
Run Code Online (Sandbox Code Playgroud)


Dav*_*dom 44

我想如果你这样做

var startDate = (new Date( 2011, 7, 30, 0, 0, 0, 0 )).getTime();
var dt = (new Date( 2011, 7, 30, 0, 0, 0, 0 )).getTime();
Run Code Online (Sandbox Code Playgroud)

在脚本的顶部,你会发现它的工作原理.

getTime()方法将日期作为整数返回,您在做的是比较对象而不是特定值.

编辑修正了上面的代码


650*_*502 12

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

if (a.getTime() === b.getTime()) ...
Run Code Online (Sandbox Code Playgroud)

===对象本身的运算符将始终返回false,因为这两个对象确实是不同的可变javascript对象.

PS:不要使用==Javascript操作符.永远.它的作用是将"疯狂"一词提升到一个全新的水平.认真.问题是应用所有类型的转换只是没有意义,例如你最终得到的东西"1"==1,x==false && (x?1:2)==1甚至a==b && b==c && a!=c是真实的(例如with x=[]或with a=[1], b=1, c=[[1]]).只是不要使用==.永远.这是"FUBAR".句号.


She*_*hef 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 />');
Run Code Online (Sandbox Code Playgroud)