Überprüfen, ob zwei Daten die gleichen Datumsinformationen haben

82

Wie kann ich überprüfen, ob zwei verschiedene Datumsobjekte dieselben Datumsinformationen haben (mit demselben Tag, Monat, Jahr ...)? Ich habe "==", "===" und .equals ausprobiert, aber keines scheint zu funktionieren.

Hellnar
quelle

Antworten:

137

Sie können verwenden valueOf()oder getTime():

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

a.getTime() === b.getTime() // prints true
Felix Kling
quelle
18
Denn im Falle >=der Werte werden in Zahlen umgewandelt. Im Falle ==der Objekte werden selbst verglichen (und nur a == awäre wahr).
Felix Kling
8
Ich
möchte
1
Wenn Sie dies verwenden, stellen Sie sicher, dass die Zeitteile dank der Funktiona.setHours(0,0,0,0);
setHours
1
Dies wird nicht funktionieren, wenn es einen Unterschied von Millisekunden gibt. Da getTime()die Zeit in Millisekunden zurückgegeben wird, können beide Zeiten auch einen Unterschied von Millisekunden aufweisen. In dieser Lösung funktioniert es nicht wie erwartet. Versuchen Sie es mittoDateString()
Rehan Sattar
41

Wenn Sie nur prüfen möchten, ob Daten unabhängig von der Uhrzeit am selben Tag auftreten, können Sie die toDateString() Methode zum Vergleichen verwenden. Diese Methode gibt nur das Datum ohne Uhrzeit zurück:

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
quelle
40

Ich habe diesen Code verwendet:

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

Dann nennst du es einfach so: if (aDate.isSameDateAs(otherDate)) { ... }

Übrigens
quelle
Warum sollten Sie ein Dutzend Funktionen ausführen, wenn Sie getTime () nur zweimal verwenden können? Oh, haben Sie darüber nachgedacht, Unterschiede in Stunde, Monat und Jahr zu ignorieren? In diesem Fall spielen möglicherweise Überlegungen zur Zeitzone eine Rolle?
ErikE
13
Weil die Frage lautete "zwei verschiedene Datumsobjekte haben die gleichen Datumsinformationen" und dieser Code genau das tut: vergleicht Datumsangaben unabhängig von der Uhrzeit
übrigens
2
ähm, ich wollte sagen "Unterschiede in Stunde, Minute und Sekunde ignorieren"
ErikE
14

Geben Sie convert in integers ein:

a = new Date(1995,11,17);
b = new Date(1995,11,17);
+a === +b;  //true
d2vid
quelle
4
fantastische Verwendung von Unary Operator
KingOfHypocrites
6

Hellnar,

Sie könnten es versuchen (entschuldigen Sie den Funktionsnamen :) - geändert nach dem Wert von felix anstelle von getTime)

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

Verwendung:

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

könnte Sie einen Teil des Weges dorthin bringen.

siehe auch:

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

Jim Tollan
quelle
4

Verwenden Sie für eine bessere Datumsunterstützung die Methoden moment.js und 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
quelle
3

subtrahieren Sie sie und vergleichen Sie sie mit Null:

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

// mach was mit den Daten ...

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

um es in eine Variable zu setzen:

var datesAreSame = !(date1 - date2);
Ege Özcan
quelle
3

Eine einfache einzeilige Alternative, um festzustellen, ob zwei Daten gleich sind, wobei der Zeitteil ignoriert wird:

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

Es wird bestimmt, ob sich die Daten a und b nicht mehr als einen Tag unterscheiden und denselben Wochentag haben.

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
quelle