Sprawdzanie, czy dwie daty mają takie same informacje o dacie

83

Jak mogę sprawdzić, czy dwa różne obiekty daty mają te same informacje o dacie (mają ten sam dzień, miesiąc, rok ...)? Próbowałem "==", "===" i .equals, ale żaden z nich nie działa.

Hellnar
źródło

Odpowiedzi:

139

Możesz użyć valueOf()lub getTime():

a = new Date(1995,11,17);
b = new Date(1995,11,17);

a.getTime() === b.getTime() // prints true
Felix Kling
źródło
18
Ponieważ w przypadku >=wartości są przeliczane na liczby. W przypadku ==obiektów porównywane są same (i tylko a == abyłoby to prawdą).
Felix Kling
8
Wystarczy zaznaczyć, że rozwiązanie to wymaga, że terminy składają się tylko z części tej pory, podczas gdy wiele osób przybywających do tej kwestii mogą mieć różne wymagania ( przykład z częściami czas w jsFiddle )
KyleMit
1
Używając tego, upewnij się, że części czasowe są ustawione na 0 dzięki funkcji setHours :a.setHours(0,0,0,0);
COil
1
To nie zadziała, jeśli jest jakaś różnica milisekund. Ponieważ getTime()zwraca czas w milisekundach, oba te czasy mogą mieć również różnicę w milisekundach. W tym rozwiązaniu nie będzie działać zgodnie z oczekiwaniami. Spróbuj użyćtoDateString()
Rehan Sattar
41

Jeśli interesuje Cię tylko sprawdzenie, czy daty przypadają w tym samym dniu bez względu na godzinę, możesz skorzystać z toDateString() metody porównania. Ta metoda zwraca tylko datę bez godziny:

var start = new Date('2015-01-28T10:00:00Z');
var end = new Date('2015-01-28T18:00:00Z');

if (start.toDateString() === end.toDateString()) {
  // Same day - maybe different times
} else {
  // Different day
}
cyberwombat
źródło
40

Użyłem tego kodu:

Date.prototype.isSameDateAs = function(pDate) {
  return (
    this.getFullYear() === pDate.getFullYear() &&
    this.getMonth() === pDate.getMonth() &&
    this.getDate() === pDate.getDate()
  );
}

Następnie nazywasz to po prostu: if (aDate.isSameDateAs(otherDate)) { ... }

Nawiasem mówiąc
źródło
Dlaczego miałbyś uruchamiać kilkanaście funkcji, skoro możesz użyć getTime () tylko dwa razy? Och, czy myślałeś o ignorowaniu różnic w godzinach, miesiącach i latach? W takim razie może kwestie strefy czasowej zaczną mieć znaczenie?
ErikE
13
Ponieważ pytanie brzmiało "dwa różne obiekty daty mają te same informacje o dacie", a ten kod właśnie to robi: porównuje daty niezależnie od czasu
Nawiasem mówiąc,
2
eee, chciałem powiedzieć „ignorowanie różnic w godzinach, minutach i
sekundach
14

Wpisz konwertuj na liczby całkowite:

a = new Date(1995,11,17);
b = new Date(1995,11,17);
+a === +b;  //true
d2vid
źródło
4
niesamowite użycie operatora jednoargumentowego
KingOfHypocrites
6

Hellnar,

możesz spróbować (przepraszam za nazwę funkcji :) - zmieniono na wartość felix zamiast getTime)

function isEqual(startDate, endDate) {
    return endDate.valueOf() == startDate.valueOf();
}

stosowanie:

if(isEqual(date1, date2)){
   // do something
}

może Cię tam dostać.

Zobacz też:

„http://www.java2s.com/Tutorial/JavaScript/0240__Date/DatevalueOf.htm”

Jim Tollan
źródło
4

Aby uzyskać lepszą obsługę dat, użyj moment.js i metody isSame

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-04-06').startOf('day');

console.log(starDate.isSame(endDate)); // false ( month is different )

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-03-06').startOf('day');

console.log(starDate.isSame(endDate)); // true ( year, month and day are the same )
que1326
źródło
3

odejmij je i porównaj do zera:

var date1 = new Date();
var date2 = new Date();

// zrób coś z datami ...

(date1 - date2) ? alert("not equal") : alert("equal");

aby umieścić go w zmiennej:

var datesAreSame = !(date1 - date2);
Ege Özcan
źródło
3

Prosta, jednowierszowa alternatywa dla określenia, czy dwie daty są równe, z pominięciem części czasowej:

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

Określa, czy daty a i b różnią się nie więcej niż jeden dzień i mają ten sam dzień tygodnia.

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

console.log(isSameDate(new Date(2017, 7, 21), new Date(2017, 7, 21))); //exact same date => true
console.log(isSameDate(new Date(2017, 7, 21, 23, 59, 59), new Date(2017, 7, 21))); //furthest same dates => true
console.log(isSameDate(new Date(2017, 7, 20, 23, 59, 59), new Date(2017, 7, 21))); //nearest different dates => false
console.log(isSameDate(new Date(2016, 7, 21), new Date(2017, 7, 21))); //different year => false
console.log(isSameDate(new Date(2017, 8, 21), new Date(2017, 7, 21))); //different month => false

Philip Bijker
źródło