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

Кто-нибудь сталкивался с чем-то подобным, или я что-то в корне не так делаю?

Я тестировал это Internet Explorer (9), Firefox 5+ и Chrome.

Обновление:

Итак, два человека опубликовали отличные ответы на мою проблему, и я благодарю вас обоих: xdazz и DaveRandom. Я читал более раннюю публикацию на stackoverflow.com по аналогичному вопросу, и парень сказал, что объекты даты можно сравнивать, как любые другие, и любой другой пример, который я обнаружил, всегда выполнял сравнение типа ‹или>, а не полного равенства, поэтому я не мог понять, почему я делал это неправильно.

Спасибо вам двоим и другим, которые опубликовали похожие ответы.


person Patrick    schedule 30.08.2011    source источник


Ответы (3)


Когда вы используете <= или >= для сравнения двух объектов даты, они сравниваются с помощью valueOf, что аналогично getTime для Date.

Но когда вы используете ==, это два разных объекта одного типа, поэтому он возвращает 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
person xdazz    schedule 30.08.2011

Я думаю, если ты это сделаешь

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() возвращает дату в виде целого числа; вы здесь сравниваете объекты, а не конкретные значения.

ИЗМЕНИТЬ Исправленный выше код

person DaveRandom    schedule 30.08.2011
comment
@Shef Только примерно на 50 секунд, и я дам вам +1 за ваши проблемы ;-) - person DaveRandom; 30.08.2011

Это одна из многих нелогичных частей 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]]). Только не используйте ==. Всегда. Это «ФУБАР». Полная остановка.

person 6502    schedule 30.08.2011
comment
Я в основном согласен с постскриптумом, но его следует подкрепить чем-то гораздо более значимым, например: 2ality.com/2011/12/strict-equality-exemptions.html - person Michael Scheper; 08.10.2015