Porównując obiekty daty w Javascript stwierdziłem, że nawet porównanie tej samej daty nie zwraca prawdy.
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
Jak mogę porównać równość tych dat? Jestem zainteresowany wykorzystaniem natywnego Date
obiektu JS, a nie bibliotek stron trzecich, ponieważ nie jest właściwe używanie JS strony trzeciej tylko do porównywania dat.
javascript
Harshana
źródło
źródło
Odpowiedzi:
Dzieje się tak, ponieważ w drugim przypadku rzeczywiste obiekty daty są porównywane, a dwa obiekty nigdy nie są sobie równe. Zmuszaj ich do numerowania:
alert( +startDate2 == +startDate3 ); // true
Jeśli chcesz bardziej jednoznacznej konwersji na liczbę, użyj:
alert( startDate2.getTime() == startDate3.getTime() ); // true
lub
alert( Number(startDate2) == Number(startDate3) ); // true
Aha, odniesienie do specyfikacji: §11.9.3 Algorytm abstrakcyjnego porównywania równości, który zasadniczo mówi o porównywaniu obiektów,
obj1 == obj2
jest prawdziwy tylko wtedy, gdy odnoszą się do tego samego obiektu, w przeciwnym razie wynik jest fałszywy.źródło
Date.prototype.getTime
zawsze zwróci liczbę ...getTime
jest najlepsze dla przejrzystości (i zdarza się, że jest najszybsze w przeglądarkach, które testowałem).Porównaj daty, używając
getTime()
zwracanej liczby milisekund z epoki (tj. Liczby):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
Rozważ również użycie
Date
konstruktora pobierającego jawną liczbę roku / miesiąca / daty, zamiast polegać na reprezentacji ciągu (zobacz: Date.parse () ). Pamiętaj, że daty w JavaScript są zawsze reprezentowane za pomocą strefy czasowej klienta (przeglądarki).źródło
Nie musisz używać metody getTime - możesz odjąć obiekt daty od innego obiektu daty. Zwróci różnicę w milisekundach (ujemną, jeśli druga data jest późniejsza)
var startDate1 = new Date("02/10/2012"); var startDate2 = new Date("01/10/2012"); var diff= (startDate1 -startDate2)
// zwraca 0, jeśli daty mają ten sam znacznik czasu
źródło
możesz porównać rzeczywiste milisekundy:
źródło
Możesz również użyć funkcji 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
źródło