Сравнение дат JavaScript не равно
Я пробовал искать людей с похожими вопросами, но ничего не нашел.
У меня есть две даты в 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.
Update:
Итак, у двух человек были отличные ответы на мою проблему, и я благодарю вас обоих: xdazz и DaveRandom. Я прочитал более раннюю запись на stackoverflow.com по аналогичному вопросу, и парень сказал, что объекты даты можно сравнить, как и любые другие, и любой другой пример, который я нашел, всегда делал < или > тип сравнения, а не полное равенство, поэтому я не смог установить связь с тем, почему я делал это неправильно.
Спасибо вам, двое, и другие, которые оставили похожие ответы.
Ответы
Ответ 1
Когда вы используете <=
или >=
для сравнения двух объектов даты, их сравнивают через 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
Ответ 2
Я думаю, если вы делаете
var startDate = (new Date( 2011, 7, 30, 0, 0, 0, 0 )).getTime();
var dt = (new Date( 2011, 7, 30, 0, 0, 0, 0 )).getTime();
В верхней части script вы обнаружите, что он работает.
Метод getTime()
возвращает дату как целое число, то, что вы делаете, сравнивает объекты, а не конкретные значения.
EDIT Исправлен код
Ответ 3
Это одна из многих нелогичных частей Javascript. Вы можете обойти эту проблему, преобразовывая дату в число с помощью .getTime()
, которая вернет, сколько миллисекунд прошло с этой даты и 00:00:00 от 1 января 1970 года.
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]]
). Просто не используйте ==
. Когда-либо. Это "FUBAR". Fullstop.
Ответ 4
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 />');
Ответ 5
<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>