我尝试过搜索有类似问题的人,但没找到任何东西。
我在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上读过类似问题的早期帖子,一个人说日期对象可以像其他任何人一样进行比较,而我发现的任何其他例子总是做一个&lt;或者&gt;比较的类型,从来没有完全相等所以我无法建立连接,为什么我做错了。
感谢你们两位,其他人也发表了类似的答案。
答案 0 :(得分:96)
当您使用<=
或>=
比较两个日期对象时,会通过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
答案 1 :(得分:43)
我想如果你这样做
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()
方法将日期作为整数返回,您在做的是比较对象而不是特定值。
编辑修正了以上代码
答案 2 :(得分:10)
这是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
为真的内容(例如{{1}或x=[]
)。只是不要使用a=[1], b=1, c=[[1]]
。永远。这是“FUBAR”。句号。
答案 3 :(得分: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 />');
答案 4 :(得分:-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>