Ao comparar objetos de data em Javascript, descobri que mesmo comparando a mesma data não retorna verdadeiro.
var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");
var startDate3 = new Date("01/10/2012");
alert(startDate1>startDate2); // true
alert(startDate2==startDate3); //false
Como posso comparar a igualdade dessas datas? Estou interessado em utilizar o Date
objeto nativo de JS e não quaisquer bibliotecas de terceiros, pois não é apropriado usar um JS de terceiros apenas para comparar as datas.
javascript
Harshana
fonte
fonte
Respostas:
Isso ocorre porque, no segundo caso, os objetos de data reais são comparados e dois objetos nunca são iguais um ao outro. Forçá-los a numerar:
alert( +startDate2 == +startDate3 ); // true
Se você quiser uma conversão mais explícita em número, use:
alert( startDate2.getTime() == startDate3.getTime() ); // true
ou
alert( Number(startDate2) == Number(startDate3) ); // true
Oh, uma referência à especificação: §11.9.3 O Algoritmo de Comparação de Igualdade Abstrata que basicamente diz ao comparar objetos,
obj1 == obj2
é verdadeiro apenas se eles se referem ao mesmo objeto, caso contrário, o resultado é falso.fonte
Date.prototype.getTime
sempre retornará um Número ...getTime
é o melhor para maior clareza (e acontece de ser mais rápido nos navegadores que testei também).Compare as datas usando o
getTime()
número de retorno de milissegundos da época (ou seja, um número):var startDate1 = new Date("02/10/2012"); var startDate2 = new Date("01/10/2012"); var startDate3 = new Date("01/10/2012"); alert(startDate1.getTime() > startDate2.getTime()); // true alert(startDate2.getTime() == startDate3.getTime()); //true
Considere também o uso do
Date
construtor usando um número explícito de ano / mês / data em vez de confiar na representação de string (consulte: Date.parse () ). E lembre-se de que as datas em JavaScript são sempre representadas usando o fuso horário do cliente (navegador).fonte
Você não precisa usar o método getTime - você pode subtrair um objeto de data de outro objeto de data. Ele retornará a diferença de milissegundos (negativo, se o segundo for uma data posterior)
var startDate1 = new Date("02/10/2012"); var startDate2 = new Date("01/10/2012"); var diff= (startDate1 -startDate2)
// avalia como 0 se as datas tiverem o mesmo carimbo de data / hora
fonte
você pode comparar os milissegundos reais:
fonte
Você também pode usar a função valueOf ()
var startDate1 = new Date("02/10/2012").valueOf(); var startDate2 = new Date("01/10/2012").valueOf(); var startDate3 = new Date("01/10/2012").valueOf(); alert(startDate1>startDate2); // 1326150000000 > 1328828400000 true alert(startDate2==startDate3); // 1328828400000 > 1326150000000 false
fonte