Vergleichen Sie zwei Daten mit JavaScript

1951

Kann jemand eine Möglichkeit vorschlagen, die Werte von zwei Daten, die größer, kleiner als und nicht in der Vergangenheit sind, mit JavaScript zu vergleichen? Die Werte stammen aus Textfeldern.

Alex
quelle
17
Wenn es um DateTime und Manipulation in JS geht, bin ich nicht weiter als momentjs :)
Halceyon
47
Sie müssen keine momentjs verwenden, um 2 Daten zu vergleichen. Verwenden Sie einfach das Date-Objekt von reinem Javascript. Überprüfen Sie die Hauptantwort auf weitere Details.
Lukas Liesis
Sie können auf folgende Antwort verweisen: stackoverflow.com/questions/4812152/… Überprüfen Sie getDateDifference und getDifferenceInDays, ob dies hilfreich sein kann.
Vikash Rajpurohit
Ich gebe Ihnen einen Grund, weiter zu schauen als Moment.js ( was ich liebe, ABER ... ): Nicht zum Schleifen von Lasten verwenden
Geek Stocks
Eine nützliche Funktion zum Aufteilen des Zeitunterschieds in Einheiten (Sekunden, Minuten, Stunden usw.) finden Sie in der Antwort unter stackoverflow.com/questions/1968167/… . Diese Antwort ist jetzt auch unter stackoverflow.com/a/46529159/3787376 verfügbar .
Edward

Antworten:

2284

Das Date - Objekt wird tun , was Sie wollen - Konstrukt eine für jeden Tag, dann vergleichen sie die Verwendung von >, <, <=oder >=.

Die ==, !=, ===und !==Betreiber benötigen Sie zu verwenden , date.getTime()wie in

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

Um klar zu sein, funktioniert es nicht, nur direkt mit den Datumsobjekten auf Gleichheit zu prüfen

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

Ich schlage vor, dass Sie Dropdown-Listen oder eine ähnliche eingeschränkte Form der Datumseingabe anstelle von Textfeldern verwenden, damit Sie sich nicht in der Hölle der Eingabevalidierung befinden.

Mondschatten
quelle
64
Auch die Methode von Ace ist nicht ausfallsicher. Sie müssen zuerst die Millisekunden zurücksetzen, und möglicherweise möchten Sie sogar die ganze Zeit zurücksetzen. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); In Kombination mit .getTime () erhalten Sie ein genaues Vergleichsergebnis
Patrick
102
@patrick, schlagen Sie vor, setHours(0,0,0,0)diesen Weg zu nennen. Beseitigt die Notwendigkeit für Anrufe setMinutes()usw. Wird auch schneller ausgeführt.
Karl
26
Vermeiden von == oder ===, um das gewünschte Ergebnis zu erhalten: jsfiddle.net/P4y5J now> = anotherNow && now <= anotherNow IST wahr FYI
Jason Sebring
5
Warum nicht einfach die toString()Methode an beiden Daten anwenden und dann mit dem ==Bediener vergleichen ? Scheint viel einfacher als das Zurücksetzen der Zeit und das anschließende Vergleichen. Gibt es dafür Nachteile?
user2019515
13
Sie können auch die numerischen Werte Ihrer Daten vergleichen, um zu vermeiden, dass die Objekte selbst verglichen werden: date1.valueOf () == date2.valueOf ()
madprog
421

Der einfachste Weg, Daten in Javascript zu vergleichen, besteht darin, sie zuerst in ein Datumsobjekt zu konvertieren und dann diese Datumsobjekte zu vergleichen.

Unten finden Sie ein Objekt mit drei Funktionen:

  • Daten.Vergleich (a, b)

    Gibt eine Nummer zurück:

    • -1 wenn a <b
    • 0 wenn a = b
    • 1 wenn a> b
    • NaN, wenn a oder b ein illegales Datum ist
  • date.inRange (d, start, end)

    Gibt einen Booleschen Wert oder NaN zurück:

    • wahr, wenn d zwischen Anfang und Ende liegt (einschließlich)
    • false, wenn d vor dem Start oder nach dem Ende steht .
    • NaN, wenn eines oder mehrere der Daten illegal sind.
  • date.convert

    Wird von den anderen Funktionen verwendet, um ihre Eingabe in ein Datumsobjekt zu konvertieren. Die Eingabe kann sein

    • ein Datum -Objekt: Der Eingang wird als zurückgegeben.
    • ein Array : Interpretiert als [Jahr, Monat, Tag]. HINWEIS Monat ist 0-11.
    • eine Zahl : Interpretiert als Anzahl von Millisekunden seit dem 1. Januar 1970 (ein Zeitstempel)
    • eine Zeichenfolge : Es werden verschiedene Formate unterstützt, z. B. "JJJJ / MM / TT", "MM / TT / JJJJ", "31. Januar 2009" usw.
    • ein Objekt : Interpretiert als Objekt mit den Attributen Jahr, Monat und Datum. HINWEIS Monat ist 0-11.

.

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}
etwas
quelle
11
(a > b) - (a < b)ist nützlich zum Sortieren von
Datumsarray
@nikita Ja, und eine Funktion, die dieses Ergebnis zurückgibt, kann verwendet Array.prototype.sortwerden, solange alle Werte gültige Daten sind. Wenn es ungültige Daten geben könnte, empfehle ich die Verwendung vonfunction ( a, b ) { a = a === undefined || a === null : NaN : a.valueOf( a ); b = a === undefined || b === null : NaN : a.valueOf( b ); return isFinite( a ) && isFinite( b ) ? ( a > b ) - ( a < b ) : NaN; }
etwa
4
@ nktssh - vielleicht, ist aber return a - beinfacher und ersetzt die gesamte return-Anweisung.
RobG
284

Vergleichen <und >wie gewohnt, aber alles, was dazu gehört, =sollte ein +Präfix verwenden. Wie so:

var x = new Date('2013-05-23');
var y = new Date('2013-05-23');

// less than, greater than is fine:
x < y; => false
x > y; => false
x === y; => false, oops!

// anything involving '=' should use the '+' prefix
// it will then compare the dates' millisecond values
+x <= +y;  => true
+x >= +y;  => true
+x === +y; => true

Hoffe das hilft!

Daniel Lidström
quelle
81
furchtbar langsam :) Ich bevorzuge x.getTime() === y.getTime()Methode, sowohl lesbar als auch extrem schnell siehe jsperf
huysentruitw
24
Der +Operator versucht, den Ausdruck in eine Zahl umzuwandeln. Date.valueOf()wird für die Konvertierung verwendet (die das gleiche zurückgibt wie Date.getTime().
Salman A
13
@WouterHuysentruit Beide sind sehr schnell (> 3 Millionen OPS im langsamsten Browser). Verwenden Sie die Methode, die Sie für besser lesbar halten
Eloims
13
Beachten Sie, dass alles , was '=' betrifft, das Präfix '+' Ihrer Antwort verwenden sollte, falsch ist. <, <=, >Und >=verwendet den gleichen Algorithmus ( abstrakter relationaler Vergleichsalgorithmus ) hinter den Kulissen.
Salman A
2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Dank Ihrer Antwort hatte der Service, den ich bei der Arbeit entwickle, einen schrecklichen Fehler, der schwer zu verfolgen war.
Gyuhyeon Lee
157

Mit < <= > >=den Vergleichsoperatoren können JavaScript-Daten verglichen werden:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

Die Gleichheitsoperatoren == != === !==können jedoch nicht zum Vergleichen (des Werts von) Daten verwendet werden, weil :

  • Zwei unterschiedliche Objekte sind weder für strenge noch für abstrakte Vergleiche gleich.
  • Ein Ausdruck, der Objekte vergleicht, ist nur wahr, wenn die Operanden auf dasselbe Objekt verweisen.

Sie können den Wert von Daten für die Gleichheit mit einer der folgenden Methoden vergleichen:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

Beides Date.getTime()und Date.valueOf()geben die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00 UTC zurück. Sowohl die NumberFunktion als auch der unäre +Operator rufen die valueOf()Methoden hinter den Kulissen auf.

Salman A.
quelle
Ist es sicher, den String in ein Date-Objekt zu konvertieren? Kann das keine Ausnahme auslösen oder unzuverlässige Ergebnisse liefern? Was kann die zuverlässigste Methode sein, um Daten in JS zu vergleichen? Wenn Sie unzuverlässige Ergebnisse sagen, kann diese Methode unterschiedliche / falsche Werte liefern, auch wenn wir sicher sind, dass sich das Datumsformat nicht ändert -> Es wäre "Donnerstag, 10. August 2017". Ihre Hilfe hier wird sehr geschätzt.
user2696258
Kann dies auf verschiedenen Betriebssystemen / Browsern / Geräten zu unzuverlässigen Ergebnissen für denselben Datumswert führen?
user2696258
1
@ user2696258 dies ist der zuverlässigste Weg , um zwei zu vergleichen Datum Objekte. Das Konvertieren einer Zeichenfolge in ein Datum ist ein anderes Problem. Verwenden Sie eine Datumsanalysebibliothek oder erstellen Sie eine eigene Lösung. Thursday, 10 Aug 2017ist ein nicht standardmäßiges Format, und verschiedene Browser analysieren es möglicherweise anders oder gar nicht. Siehe Anmerkungen zu Date.parse.
Salman A
88

Die mit Abstand einfachste Methode besteht darin, ein Datum vom anderen zu subtrahieren und das Ergebnis zu vergleichen.

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);

Peter Wilkinson
quelle
68

Das Vergleichen von Daten in JavaScript ist ganz einfach ... JavaScript verfügt über ein integriertes Vergleichssystem für Daten, das den Vergleich so einfach macht ...

Befolgen Sie einfach diese Schritte, um 2 Datumswerte Stringzu vergleichen. Sie haben beispielsweise 2 Eingaben, in denen jeweils ein Datumswert enthalten ist, und Sie können sie vergleichen ...

1. Sie haben 2 Zeichenfolgenwerte, die Sie von einer Eingabe erhalten, und Sie möchten sie vergleichen. Diese sind wie folgt:

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2. Sie müssen Date Objectals Datumswerte verglichen werden. Konvertieren Sie sie einfach in ein Datum. Verwenden Sie new Date()sie zur Vereinfachung der Erklärung nur neu, aber Sie können es tun, wie Sie möchten:

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

3. Vergleichen Sie sie jetzt einfach mit dem> < >= <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

Daten in Javascript vergleichen

Alireza
quelle
Ich fand heraus, dass die meisten Lösungen zum Vergleichen von Daten in jedem Browser funktionieren. Das Problem, das ich hatte, war mit IE. Diese Lösung hat auf der ganzen Linie funktioniert. Danke Alireza!
Joshua Oglesbee
2
Es funktioniert nicht. Und es sollte nicht funktionieren. Sie vergleichen ein Datumsobjekt.
Maxisam
3
@maxisam Nein, es funktioniert , weil die Vergleichsoperator ( <, >, <=, >=) verwendet wird, werden die Date - Objekte zunächst in Unix - Epoche (Sekunden), und es funktioniert gut. Dies kann jedoch zu dem häufigen Fehler führen, date1 == date2dass tatsächlich ein Fehler eingeführt wird, da nicht der Wert, sondern die Instanzgleichheit überprüft wird. Um dies zu verhindern und die Gleichheit des Datumswerts zu überprüfen, würde dies funktionieren: date1.valueOf() == date2.valueOf()oder kürzerdate1+0 == date2+0
humanityANDpeace
Anmerkung von MDN Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies. und Note: Parsing of date strings with the Date constructor (and Date.parse, they are equivalent) is strongly discouraged due to browser differences and inconsistencies.
AaA
35

Nur Tag vergleichen (Zeitkomponente ignorieren):

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

Verwendungszweck:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}
mpen
quelle
das ist gut. aber was ist, wenn ich nextDay oder previousDay vergleiche. Ich habe versucht, diese Date.prototype.nextDay = Funktion (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth (); } aber es wird nur in diesem Monat funktionieren. Wie vergleiche ich über Monat oder über Jahre
Paresh3489227
32

Welches Format?

Wenn Sie ein Javascript- Datumsobjekt erstellen , können Sie es einfach subtrahieren, um einen Millisekundenunterschied zu erhalten (bearbeiten: oder einfach vergleichen):

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true
Jason S.
quelle
1
Das Subtrahieren ist eine gute Idee, da es das ==oben erwähnte Vergleichsproblem vermeidet .
Devios1
Welches JavaScript REPL verwenden Sie?
Hyde
JSDB - siehe jsdb.org - Ich benutze es heutzutage weniger oft, da Python meine bevorzugte Sprache ist, aber es ist immer noch ein großartiges Dienstprogramm.
Jason S
1
@ StuartP.Bentley Ich weiß es nicht, weil ich keinen von ihnen benutze. Ich benutze jsdb.
Jason S
Wenn Sie eine große Anzahl von Daten durchlaufen, scheint dies am effizientesten zu sein, da keine Konvertierung mit getTime () erforderlich ist.
Pcarvalho
16

Sie verwenden diesen Code,

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

Überprüfen Sie auch diesen Link http://www.w3schools.com/js/js_obj_date.asp

hungrig bleiben
quelle
3
Ein Grund, nicht auf W3Schools zu verweisen: w3fools.com - eine nette Lösung - ist es standardkonform und funktioniert es in allen Browsern?
Mathias Lykkegaard Lorenzen
1
Weitere Informationen finden Sie im Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
Daniel Lidström
16

KURZE ANTWORT

Hier ist eine Funktion, die {boolean} zurückgibt, wenn die Demo von dateTime> zu dateTime in Aktion ist

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

Erläuterung

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

Da Sie jetzt beide Datums- und Uhrzeitangaben im Zahlentyp haben, können Sie sie mit beliebigen Vergleichsvorgängen vergleichen

(>, <, = ,! =, == ,! ==,> = AND <=)

Dann

Wenn Sie mit der C#benutzerdefinierten Zeichenfolge für Datums- und Zeitformat vertraut sind, sollte diese Bibliothek genau dasselbe tun und Ihnen dabei helfen, Datum und Uhrzeit dtmFRM zu formatieren, unabhängig davon, ob Sie eine Datums- / Zeitzeichenfolge oder ein Unix-Format übergeben

Verwendungszweck

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

DEMO

alle müssen Sie tun , irgendwelches Format in der Bibliothek befriedet ist vorbei jsDatei

Mina Gabriel
quelle
neues Datum (dtmfrom)> = neues Datum (dtmto) ist viel langsamer als neues Datum (dtmfrom) .getTime ()> = neues Datum (dtmto) .getTime ()
Mina Gabriel
Vielleicht, aber der Unterschied liegt bei 30 bis 120 Nanosekunden (z. B. 0,000000075 Sekunden) pro Vorgang, je nach Browser, also nicht wirklich signifikant.
RobG
16

Der einfache Weg ist,

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}
MICHAEL PRABHU
quelle
14

Hinweis - Nur Datum vergleichen Teil:

Wenn wir zwei Daten in Javascript vergleichen. Es werden auch Stunden, Minuten und Sekunden berücksichtigt. Wenn wir also nur das Datum vergleichen müssen, ist dies der Ansatz:

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

Jetzt: if date1.valueOf()> date2.valueOf()wird wie ein Zauber wirken.

Sanjeev Singh
quelle
13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

quelle
1
Was ist die Art von a oder b? Termine? Welches Format? Das scheint bei mir nicht zu funktionieren.
Luci
5
unter der Annahme , aund bwobei DateObjekte , die Sie auch nutzen könnenreturn a*1 == b*1;
Udo G
4
@UdoG: Kürzere:+a == +b
Mpen
13
var date = new Date(); // will give you todays date.

// following calls, will let you set new dates.
setDate()   
setFullYear()   
setHours()  
setMilliseconds()   
setMinutes()    
setMonth()  
setSeconds()    
setTime()

var yesterday = new Date();
yesterday.setDate(...date info here);

if(date>yesterday)  // will compare dates
Narendra Kamma
quelle
11

Um den vielen vorhandenen Optionen noch eine weitere Möglichkeit hinzuzufügen, können Sie Folgendes versuchen:

if (date1.valueOf()==date2.valueOf()) .....

... was für mich zu funktionieren scheint. Natürlich müssen Sie sicherstellen, dass beide Daten nicht undefiniert sind ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

Auf diese Weise können wir sicherstellen, dass ein positiver Vergleich durchgeführt wird, wenn beide ebenfalls undefiniert sind, oder ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

... wenn Sie es vorziehen, dass sie nicht gleich sind.

Paul
quelle
11

Über Moment.js

Jsfiddle: http://jsfiddle.net/guhokemk/1/

function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

Die Methode gibt 1 zurück, wenn dateTimeAgrößer als istdateTimeB

Die Methode gibt 0 zurück, wenn dateTimeAgleichdateTimeB

Die Methode gibt -1 zurück, wenn sie dateTimeAkleiner als istdateTimeB

Razan Paul
quelle
3
Es ist nicht erforderlich, eine externe Bibliothek wie Moment zu verwenden, um einen Datumsvergleich für DateObjekte durchzuführen .
amb
Moment war für meinen Anwendungsfall absolut notwendig. Danke, Razan!
Razorsyntax
1
Warum verwenden Sie überhaupt Operatoren <oder >Operatoren, wenn der Moment bereits mit praktischen Vergleichsmethoden wie .isBeforeund .isAfter
einhergeht?
10

Hüten Sie sich vor der Zeitzone

Ein Javascript-Datum kennt keine Zeitzone . Es ist ein Moment in der Zeit (Ticks seit der Epoche) mit praktischen Funktionen zum Übersetzen von und zu Zeichenfolgen in der "lokalen" Zeitzone. Wenn Sie mit Datumsangaben mithilfe von Datumsobjekten arbeiten möchten, wie dies hier jeder tut, möchten Sie, dass Ihre Datumsangaben UTC Mitternacht zu Beginn des betreffenden Datums darstellen. Dies ist eine übliche und notwendige Konvention, mit der Sie unabhängig von der Jahreszeit oder der Zeitzone ihrer Erstellung mit Daten arbeiten können. Sie müssen also sehr wachsam sein, um den Begriff der Zeitzone zu verwalten, insbesondere wenn Sie Ihr Mitternachts-UTC-Datumsobjekt erstellen.

In den meisten Fällen soll Ihr Datum die Zeitzone des Benutzers widerspiegeln. Klicken Sie, wenn heute Ihr Geburtstag ist . Benutzer in Neuseeland und den USA klicken gleichzeitig und erhalten unterschiedliche Daten. In diesem Fall tun Sie dies ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

Manchmal übertrifft die internationale Vergleichbarkeit die lokale Genauigkeit. In diesem Fall tun Sie dies ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

Jetzt können Sie Ihre Datumsobjekte direkt vergleichen, wie die anderen Antworten vermuten lassen.

Nachdem Sie beim Erstellen darauf geachtet haben, die Zeitzone zu verwalten, müssen Sie auch sicherstellen, dass die Zeitzone beim Konvertieren in eine Zeichenfolgendarstellung nicht angezeigt wird. So können Sie sicher verwenden ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

Und vermeiden Sie alles andere, besonders ...

  • getYear(), getMonth(),getDate()
bbsimonbb
quelle
8

Angenommen, Sie haben die Datumsobjekte A und B, erhalten ihren EPOC-Zeitwert und subtrahieren dann, um die Differenz in Millisekunden zu erhalten.

var diff = +A - +B;

Das ist alles.

foobar
quelle
8

Um zwei Daten zu vergleichen, können wir die JavaScript-Bibliothek date.js verwenden, die Sie unter folgender Adresse finden: https://code.google.com/archive/p/datejs/downloads

und verwenden Sie die Date.compare( Date date1, Date date2 )Methode und es wird eine Zahl zurückgegeben, die das folgende Ergebnis bedeutet:

-1 = Datum1 ist weniger als Datum2.

0 = Werte sind gleich.

1 = Datum1 ist größer als Datum2.

Salahin Rocky
quelle
8

Wenn Sie zwei Daten subtrahieren, erhalten Sie die Differenz in Millisekunden, wenn Sie 0dasselbe Datum erhalten

function areSameDate(d1, d2){
    return d1 - d2 === 0
}
Yukulélé
quelle
7

Um Datumsangaben aus freiem Text in Javascript zu erstellen, müssen Sie diese in das Date () -Objekt analysieren.

Sie können Date.parse () verwenden, bei dem Freitext versucht, es in ein neues Datum umzuwandeln. Wenn Sie jedoch die Kontrolle über die Seite haben, würde ich empfehlen, stattdessen HTML-Auswahlfelder oder eine Datumsauswahl wie das YUI-Kalendersteuerelement oder die jQuery-Benutzeroberfläche zu verwenden Datepicker .

Sobald Sie ein Datum haben, auf das andere hingewiesen haben, können Sie die Daten mithilfe einer einfachen Arithmetik subtrahieren und wieder in eine Anzahl von Tagen umwandeln, indem Sie die Anzahl (in Sekunden) durch die Anzahl der Sekunden pro Tag (60 * 60 *) dividieren. 24 = 86400).

sh1mmer
quelle
6
var date_today=new Date();
var formated_date = formatDate(date_today);//Calling formatDate Function

var input_date="2015/04/22 11:12 AM";

var currentDateTime = new Date(Date.parse(formated_date));
var inputDateTime   = new Date(Date.parse(input_date));

if (inputDateTime <= currentDateTime){
    //Do something...
}

function formatDate(date) {
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var ampm = hours >= 12 ? 'PM' : 'AM';

    hours = hours % 12;
    hours = hours ? hours : 12; // the hour '0' should be '12'
    hours   = hours < 10 ? '0'+hours : hours ;

    minutes = minutes < 10 ? '0'+minutes : minutes;

    var strTime = hours+":"+minutes+ ' ' + ampm;
    return  date.getFullYear()+ "/" + ((date.getMonth()+1) < 10 ? "0"+(date.getMonth()+1) :
    (date.getMonth()+1) ) + "/" + (date.getDate() < 10 ? "0"+date.getDate() :
    date.getDate()) + " " + strTime;
}
Vickisys
quelle
5

Eine verbesserte Version des von "some" geposteten Codes

/* Compare the current date against another date.
 *
 * @param b  {Date} the other date
 * @returns   -1 : if this < b
 *             0 : if this === b
 *             1 : if this > b
 *            NaN : if a or b is an illegal date
*/ 
Date.prototype.compare = function(b) {
  if (b.constructor !== Date) {
    throw "invalid_date";
  }

 return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? 
          (this>b)-(this<b) : NaN 
        );
};

Verwendungszweck:

  var a = new Date(2011, 1-1, 1);
  var b = new Date(2011, 1-1, 1);
  var c = new Date(2011, 1-1, 31);
  var d = new Date(2011, 1-1, 31);

  assertEquals( 0, a.compare(b));
  assertEquals( 0, b.compare(a));
  assertEquals(-1, a.compare(c));
  assertEquals( 1, c.compare(a));
Rodrigo Pinho Pereira de Souza
quelle
Vermutlich eine ist die Date - Instanz , auf die die Methode aufgerufen wird. In welchem ​​Fall kann a ein ungültiges Datum sein, aber dennoch eine Datumsinstanz?
RobG
5

Wenn Ihr Datumsformat wie folgt lautet, können Sie diesen Code verwenden:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

Es wird geprüft, ob die 20121121Anzahl größer als ist 20121103oder nicht.

totten
quelle
4
Wenn es bereits im ISO8601-Format (JJJJ-MM-TT) vorliegt, müssen Sie keine Zeichen entfernen oder in eine Ganzzahl konvertieren. Vergleichen Sie einfach die Zeichenfolgen first == secondoder first < secondoder first > second. Das ist eine der vielen Schönheiten mit ISO8601 im Vergleich zu MM / TT / JJ, TT / MM / JJ, JJ / TT / MM, TT / JJ / MM oder MM / JJ / TT.
einige
5

Ich speichere normalerweise Dateswie timestamps(Number)in Datenbanken.

Wenn ich vergleichen muss, vergleiche ich einfach zwischen diesen Zeitstempeln oder

konvertieren Sie es in Datumsobjekt und vergleichen Sie es > <gegebenenfalls mit.

Beachten Sie, dass == oder === nur dann ordnungsgemäß funktioniert, wenn Ihre Variablen Referenzen desselben Datumsobjekts sind.

Konvertieren Sie diese Datumsobjekte zuerst in einen Zeitstempel (eine Nummer) und vergleichen Sie dann deren Gleichheit.


Datum zum Zeitstempel

var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00
var timestamp = new Date().getTime(); // Current Timestamp

Zeitstempel bis heute

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);
jwchang
quelle
Dies ist die beste Antwort - und die schnellsten jsperf.com/comparing-date-objects
Scott Stensland
3

DatesVersuchen Sie vor dem Vergleichen des Objekts, beide Millisekunden auf Null zu setzen Date.setMilliseconds(0);.

In einigen Fällen, in denen das DateObjekt dynamisch in Javascript erstellt wird, Date.getTime()ändern sich die Millisekunden , wenn Sie das weiter drucken , wodurch die Gleichheit beider Daten verhindert wird.

Júlio Paulillo
quelle
3

Performance

Heute 2020.02.27 teste ich ausgewählte Lösungen unter Chrome v80.0, Safari v13.0.5 und Firefox 73.0.1 unter MacOs High Sierra v10.13.6

Schlussfolgerungen

  • Die Lösungen d1==d2(D) und d1===d2(E) sind für alle Browser am schnellsten
  • Lösung getTime(A) ist schneller als valueOf(B) (beide sind mittelschnell)
  • Die Lösungen F, L, N sind für alle Browser am langsamsten

Geben Sie hier die Bildbeschreibung ein

Einzelheiten

Im Folgenden werden Snippet-Lösungen vorgestellt, die in Leistungstests verwendet werden. Sie können HIER einen Test in Ihrer Maschine durchführen

Ergebnisse für Chrom

Geben Sie hier die Bildbeschreibung ein

Kamil Kiełczewski
quelle
Aber d1==d2oder d1===d2ist im Kontext der Frage nutzlos.
TheMaster
1
        from_date ='10-07-2012';
        to_date = '05-05-2012';
        var fromdate = from_date.split('-');
        from_date = new Date();
        from_date.setFullYear(fromdate[2],fromdate[1]-1,fromdate[0]);
        var todate = to_date.split('-');
        to_date = new Date();
        to_date.setFullYear(todate[2],todate[1]-1,todate[0]);
        if (from_date > to_date ) 
        {
            alert("Invalid Date Range!\nStart Date cannot be after End Date!")

            return false;
        }

Verwenden Sie diesen Code, um das Datum mit Javascript zu vergleichen.

Danke D.Jeeva

Jeeva
quelle
Ich denke, dies ist eine gute Antwort, da wir das Format "TT / MM / JJ" haben und dies tun müssen, um beide Daten zu vergleichen. Ich weiß nicht, ob es die beste Antwort ist, aber es ist genug. Vielen Dank für das Teilen.
Danigonlinea
1
var curDate=new Date();
var startDate=document.forms[0].m_strStartDate;

var endDate=document.forms[0].m_strEndDate;
var startDateVal=startDate.value.split('-');
var endDateVal=endDate.value.split('-');
var firstDate=new Date();
firstDate.setFullYear(startDateVal[2], (startDateVal[1] - 1), startDateVal[0]);

var secondDate=new Date();
secondDate.setFullYear(endDateVal[2], (endDateVal[1] - 1), endDateVal[0]);
if(firstDate > curDate) {
    alert("Start date cannot be greater than current date!");
    return false;
}
if (firstDate > secondDate) {
    alert("Start date cannot be greater!");
    return false;
}
user1931504
quelle
1

Folgendes habe ich in einem meiner Projekte getan:

function CompareDate(tform){
     var startDate = new Date(document.getElementById("START_DATE").value.substring(0,10));
     var endDate = new Date(document.getElementById("END_DATE").value.substring(0,10));

     if(tform.START_DATE.value!=""){
         var estStartDate = tform.START_DATE.value;
         //format for Oracle
         tform.START_DATE.value = estStartDate + " 00:00:00";
     }

     if(tform.END_DATE.value!=""){
         var estEndDate = tform.END_DATE.value;
         //format for Oracle
         tform.END_DATE.value = estEndDate + " 00:00:00";
     }

     if(endDate <= startDate){
         alert("End date cannot be smaller than or equal to Start date, please review you selection.");
         tform.START_DATE.value = document.getElementById("START_DATE").value.substring(0,10);
         tform.END_DATE.value = document.getElementById("END_DATE").value.substring(0,10);
         return false;
     }
}

Aufruf auf Formular onsubmit. hoffe das hilft.

Brijesh
quelle