2009-07-18 5 views
4

Я сравнения дат с чем-то вроде этого:Сравнить Javascript даты

var dt = new Date();  

dt.setDate("17");    
dt.setMonth(06); 
dt.setYear("2009"); 

var date = new Date(); 

console.log("dt(%s) == date(%s) == (%s)", dt, date, (dt == date)); 

if(now == dt) { 
    .... 
} 

Строковые значения являются динамическими, конечно.

В журналах я вижу:

dt(Fri Jul 17 2009 18:36:56 GMT-0500 (CST)) == date(Fri Jul 17 2009 18:36:56 GMT-0500 (CST) == (false) 

Я попытался .equals(), но он не работает (я пробовал на Java часть JavaScript: P)

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

+0

где переменная 'now'? Вы можете использовать var now = new Date(); – SolutionYogi

ответ

8

Следующий код должен решить проблему:

(myDate.getTime() == myOtherDate.getTime()) 

Проблема заключается в том, что когда вы пишете:

(myDate == myOtherDate) 

... вы на самом деле просите «Является ли myDate указывающие на тот же объект что myOtherDate указывает на? ", а не" myDate идентичен myOtherDate? ".

Решение состоит в том, чтобы использовать getTime, чтобы получить число, представляющее объект Date (и поскольку getTime возвращает количество миллисекунд с момента времени эпохи, это число будет точного представления объекта Date), а затем использовать этот номер для сравнения (сравнение чисел будет работать, как ожидалось).

Стив

+0

Должен ли я считать, что я мог бы потерять несколько миллисекунд в этом процессе? ? – OscarRyz

+0

Стив, это неправильно, что вы сказали об операторе == на дату. Это не C# или JAVA. Проблема в том, что каждый компонент Date имеет разное время, и сравнение дает false. – SolutionYogi

+0

@Oscar Reyes: Нет, «getTime()» возвращает точное количество миллисекунд с момента времени, поэтому все должно быть на месте. –

3

Проблема с кодом является то, что вы сравниваете даты/времени часть вместо только даты.

Попробуйте этот код:

var myDate = new Date(); 
    myDate.setDate(17); 
    myDate.setMonth(7); 
    myDate.setYear(2009); 

    //Delay code - start 
    var total = 0; 
    for(var i=0; i<10000;i++) 
     total += i; 
    //Delay code - end 

    var now = new Date(); 

    console.log(now.getTime() == myDate.getTime()); 

Если вы держите в коде цикла (идентифицированной «Задержка кода -start»), консоль покажет «ложь», и если вы удалите для кода петли, консоль будет log 'true', хотя в обоих случаях myDate - 7/17/2009, а сейчас - 7/17/2009.

Проблема в том, что объект даты JavaScript хранит как дату , так и время. Если вы хотите сравнить только дату, вам нужно написать код.

function areDatesEqual(date1, date2) 
{ 
    return date1.getFullYear() == date2.getFullYear() 
      && date1.getMonth() == date2.getMonth() 
      && date1.getDate() == date2.getDate(); 
} 

Эта функция будет печатать 'true', если две части даты javascript равны, игнорируя связанную часть времени.

+1

Никогда не используйте «getYear()» - он устарел. Вместо этого используйте «getFullYear()». –

+0

Вы правы, моя ошибка. Но я надеюсь, что вы догадались о своем первоначальном ответе, в котором вы говорите, что дата сравнивает «ссылки», а не значение. – SolutionYogi

+0

Ох, я боялся, что это произойдет. На самом деле я знал это, но не хотел смотреть на это: P Итак, функция, использующая то, что вы показали + getHour() и getMinute и т. Д. Et, в порядке? – OscarRyz

0
=> (myDate.getTime() == myOtherDate.getTime()) 

(myDate == myOtherDate) не работает, он сравнивает два объекта (указатели) вместо значения, которые они содержат. Используйте getTime, чтобы получить целочисленное представление Date и затем сравнить.

Смежные вопросы