Сравнение дат 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>