Vergleichstermin nur ohne Vergleich der Uhrzeit in JavaScript

397

Was ist mit dem folgenden Code falsch?

Vielleicht wäre es einfacher, nur Datum und nicht Uhrzeit zu vergleichen. Ich bin mir auch nicht sicher, wie ich das machen soll, und ich habe gesucht, aber ich konnte mein genaues Problem nicht finden.

Übrigens, wenn ich die beiden Daten in einer Warnung anzeige, werden sie als genau gleich angezeigt.

Mein Code:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

Gibt es eine einfachere Möglichkeit, Daten zu vergleichen und die Uhrzeit nicht zu berücksichtigen?

Molekülzz
quelle

Antworten:

781

Ich lerne immer noch JavaScript. Die einzige Möglichkeit, zwei Daten ohne Uhrzeit zu vergleichen, besteht darin, die setHoursMethode des Date-Objekts zu verwenden und die Stunden, Minuten, Sekunden und Millisekunden auf Null zu setzen. Vergleichen Sie dann die beiden Daten.

Zum Beispiel,

date1 = new Date()
date2 = new Date(2011,8,20)

date2wird mit Stunden, Minuten, Sekunden und Millisekunden auf Null gesetzt, aber mit date1 werden sie auf die Zeit gesetzt, zu der date1 erstellt wurde. Gehen Sie wie folgt vor, um die Stunden, Minuten, Sekunden und Millisekunden am Datum1 zu entfernen:

date1.setHours(0,0,0,0)

Jetzt können Sie die beiden Daten nur als DATEN vergleichen, ohne sich um Zeitelemente kümmern zu müssen.

Nexar
quelle
63
Bitte beachten Sie, dass das Testen mit date1 === date2kein konsistentes Verhalten zu bieten scheint. es ist besser zu tun date1.valueOf() === b.valueOf()oder sogar date1.getTime() === date2.getTime(). Fremdheit.
Erwin Wessels
4
Seien Sie vorsichtig: Wenn Datum1 und Datum2 im Winter und Sommer liegen und Sie mit addDays (1) von einem zum anderen iterieren möchten, besteht das Problem darin, dass sie aufgrund der Sommerzeit nicht dieselbe Zeitzone haben, also die letzte Ein Vergleich, der gleiche Daten ergeben sollte, funktioniert nicht, da die beiden Daten nicht wirklich um 00: 00: 00: 0 liegen.
Oliver
9
Ich weiß, dass dies eine alte Frage ist, aber sie taucht bei der Suche zuerst bei Google auf. Seien Sie vorsichtig mit dieser Antwort. Dies gibt falsche Antworten, wenn sich der Benutzer nicht in derselben Zeitzone befindet wie der Ersteller des Datumsobjekts. Ändern Sie beispielsweise die Zeitzone auf dem Betriebssystem Ihres Computers in die Zeit an der Ostküste (USA). Öffnen Sie die Konsole Ihres Browsers und geben Sie ein var date2 = new Date(2011,8,20). Ändern Sie nun die Zeitzone des Betriebssystems in Pacific Time (US). Im gleichen Browser-Konsolentyp erhalten date2.toDateString()Sie Mon Sep 19 2011statt Dienstag den 20. zurück!
Adam
9
Beachten Sie auch, dass setHours()die Zeit basierend auf der aktuellen Zeitzone festgelegt wird, die vom Browser automatisch erkannt wird. Versuchen Sie: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());druckt "2016-02-28T15:00:00.000Z", Datum 28, aber nicht 29 Meine aktuelle Zeitzone istAsia/Tokyo
transang
8
Diese Antwort sollte wirklich aktualisiert werden, um setUTCxxxMethoden anstelle der lokalen / zeitzonenbewussten Varianten zu verwenden.
Stijn de Witt
136

Hüten Sie sich vor der Zeitzone

Wenn Sie das Datumsobjekt verwenden, um nur ein Datum sofort darzustellen, geraten Sie in ein großes Problem mit übermäßiger Genauigkeit. Sie müssen Zeit und Zeitzone verwalten, um sie fernzuhalten, und sie können sich jederzeit wieder einschleichen. Die akzeptierte Antwort auf diese Frage fällt in die Falle.

Ein Javascript-Datum kennt keine Zeitzone . Es ist ein Moment in der Zeit (Ticks seit der Epoche) mit praktischen (statischen) Funktionen zum Übersetzen in und aus Zeichenfolgen, wobei standardmäßig die "lokale" Zeitzone des Geräts oder, falls angegeben, UTC oder eine andere Zeitzone verwendet wird. Um nur ein Datum ™ mit einem Datumsobjekt darzustellen , möchten Sie, dass Ihre Daten 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, sowohl beim Erstellen Ihres Mitternachts-UTC-Datumsobjekts als auch beim Serialisieren.

Viele Leute sind durch das Standardverhalten der Konsole verwirrt. Wenn Sie ein Datum auf die Konsole sprühen, enthält die angezeigte Ausgabe Ihre Zeitzone. Dies liegt nur daran, dass die Konsole toString()Ihr Datum anruft und toString()Ihnen eine lokale Vertretung bietet. Das zugrunde liegende Datum hat keine Zeitzone ! (Solange die Zeit mit dem Zeitzonenversatz übereinstimmt, haben Sie immer noch ein Mitternachts-UTC-Datumsobjekt.)

Deserialisieren (oder Erstellen von UTC-Datumsobjekten um Mitternacht)

Dies ist der Rundungsschritt mit dem Trick, dass es zwei "richtige" Antworten gibt. 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

Deserialisieren Sie ein Datum

Oft haben Daten auf dem Draht das Format JJJJ-MM-TT. Um sie zu deserialisieren, tun Sie dies ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

Serialisierung

Nachdem Sie beim Erstellen darauf geachtet haben, die Zeitzone zu verwalten, müssen Sie jetzt sicherstellen, dass die Zeitzone beim Zurückkonvertieren 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()

Um Ihre Frage zu beantworten, 7 Jahre zu spät ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

Sehen Sie es laufen ...

Update 2019 ... kostenlose Sachen ...

Angesichts der Popularität dieser Antwort habe ich alles in Code eingefügt. Die folgende Funktion gibt ein umschlossenes Datumsobjekt zurück und macht nur die Funktionen verfügbar, die mit just-a-date ™ sicher verwendet werden können.

Rufen Sie es mit einem Date-Objekt auf und es wird in JustADate aufgelöst, das die Zeitzone des Benutzers widerspiegelt. Nennen Sie es mit einer Zeichenfolge: Wenn es sich bei der Zeichenfolge um eine ISO 8601 mit angegebener Zeitzone handelt, runden wir den Zeitteil ab. Wenn keine Zeitzone angegeben ist, konvertieren wir sie in ein Datum, das die lokale Zeitzone widerspiegelt, genau wie für Datumsobjekte.

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())

bbsimonbb
quelle
3
Ihre Antwort enthält wirklich wertvolle Informationen! Leider haben Sie die Antwort auf die eigentliche Frage von OP nicht wirklich hinzugefügt, was mich daran hinderte, sie zu bewerten. Fügen Sie ein kleines Code-Snippet hinzu, das die Frage von OP beantwortet.
Stijn de Witt
Ha ha ha @ '7 Jahre zu spät'! Ich mag deinen Stil user1585345! Du hast meine Stimme!
Stijn de Witt
Ich fand das hilfreich. Beachten Sie, dass das Snippet "Internationale Vergleichbarkeit" einen Tippfehler enthält. Ich denke, es sollte sein: neues Datum (Date.UTC (myDate.getUTCFullYear (), myDate.getUTCMonth (), myDate.getUTCDate ()));
RikRak
1
Ich wünschte, ich könnte diese Antwort 100 Mal positiv bewerten !!!
Sнаđошƒаӽ
77

Wie wäre es damit?

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

Sie können den Datumsteil des Datums wie folgt vergleichen, ohne den Wert Ihrer Variablen zu beeinflussen:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true
Geschickt
quelle
Dies ist bei weitem die eleganteste Antwort auf den ursprünglichen Beitrag. Ich habe für meine Zwecke keine separate Funktion erstellt, sondern nur die beiden Codezeilen eingefügt.
Danimal Reks
25

Verwenden von Moment.js

Wenn Sie die Möglichkeit haben, eine Bibliothek eines Drittanbieters einzuschließen, lohnt es sich auf jeden Fall, einen Blick auf Moment.js zu werfen . Es macht die Arbeit mit Dateund DateTimeviel, viel einfacher.

Wenn Sie beispielsweise sehen, ob ein Datum nach dem anderen kommt, aber deren Zeiten ausschließt, würden Sie Folgendes tun:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

Der zweite Parameter , den Sie in Pass isAfterist die Genauigkeit des Vergleichs zu tun und jeder sein kann year, month, week, day, hour, minuteoder second.

Joshua Pinter
quelle
4
Es wurde eine 100-fache Beschleunigung von einer momentjs-Lösung zu einer Date () + sethours-Lösung erreicht. vorsichtige Freunde :-)
2c2c
@ 2c2c Interessant. Auf jeden Fall gut, um die Auswirkungen auf die Leistung zu kennen. Wie viele Operationen haben Sie für Ihren Benchmark verwendet?
Joshua Pinter
1
Ich war bei etwa 1mil Vergleiche. hat keinen tatsächlichen Benchmark eingerichtet
2c2c
17

Vergleichen Sie einfach mit .toDateString wie folgt:

new Date().toDateString();

Dadurch erhalten Sie nur einen Datums-Teil und keine Zeit oder Zeitzone wie folgt:

"Fr 03 Feb 2017"

Daher können beide Daten in diesem Format ebenfalls ohne Zeitanteil verglichen werden.

Rahi
quelle
2
Das ist ein guter Anfang, aber es erlaubt keine Vergleiche, da es jetzt eine Zeichenfolge ist. Zum Vergleich ändern Sie es wieder in ein new Date(new Date().toDateString());
Datumsobjekt,
@GridTrekkor Stimmt, aber wenn Sie nur einen schnellen Gleichheitstest wünschen, ist dies die einfachste Lösung.
CM
8

Dies ist möglicherweise eine etwas sauberere Version. Beachten Sie auch, dass Sie bei der Verwendung von parseInt immer einen Radix verwenden sollten.

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

Weitere Informationen zum Radix finden Sie auf der Seite MDC parseInt .

JSLint ist ein großartiges Tool zum Abfangen von Dingen wie einem fehlenden Radix und vielen anderen Dingen, die zu undurchsichtigen und schwer zu debuggenden Fehlern führen können. Es zwingt Sie, bessere Codierungsstandards zu verwenden, um zukünftige Kopfschmerzen zu vermeiden. Ich verwende es für jedes JavaScript-Projekt, das ich codiere.

Nutzloser Code
quelle
@EmKay Dies sollte jetzt kein so großes Problem sein, da ES5 in den meisten Browsern ziemlich Standard ist und die oktale Interpretation verbietet, ABER einige Browser verwenden aus Gründen der Abwärtskompatibilität möglicherweise immer noch die alte oktale Interpretation, sodass ich weiterhin einen Radix verwenden würde für die absehbare Zukunft.
Nutzloser Code
Wenn Sie im strengen Modus arbeiten, werden oktale Interpretationen Fehler auslösen. Dies ist eine gute Sache, da Sie damit Fehler finden können, die möglicherweise falsch interpretiert werden.
Nutzloser Code
4

Die date.js- Bibliothek ist für diese Dinge praktisch. Dies erleichtert das Skripten von JS-Datumsangaben erheblich.

Diodeus - James MacFarlane
quelle
11
Können Sie weitere Informationen hinzufügen, wie diese Bibliothek dies erleichtert?
Mahmoud Hanafy
4

Wenn Sie das Datum wirklich nur ohne Zeitkomponente vergleichen, besteht eine andere Lösung, die sich möglicherweise falsch anfühlt, aber funktioniert und alle Date()Zeit- und Zeitzonenprobleme vermeidet , darin, das ISO-Zeichenfolgendatum direkt mithilfe des Zeichenfolgenvergleichs zu vergleichen:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

Sie können das aktuelle Datum (UTC-Datum, nicht unbedingt das lokale Datum des Benutzers) abrufen, indem Sie:

> new Date().toISOString().split("T")[0]
"2019-04-22"

Mein Argument dafür ist die Einfachheit des Programmierers - es ist viel weniger wahrscheinlich, dass Sie dies verpfuschen, als wenn Sie versuchen, Datenzeiten und Offsets korrekt zu handhaben, wahrscheinlich auf Kosten der Geschwindigkeit (ich habe die Leistung nicht verglichen).

Brittohalloran
quelle
Sie können auch tun new Date().toISOString().substr(0, 10) // "2019-04-22".
Stomy
Für das lokale Datum (Nicht-UTC-Datum) können Sie verwenden new Date().toLocaleDateString() // "8/26/2019". Aber dann ist der Vergleich des Textes nicht genau (wie "8/26/2019" >= "9/29/2001"ist falsch). Sie müssen es also konvertieren, um es new Date(new Date().toLocaleDateString())genau mit einem anderen Datum zu vergleichen.
Stomy
4

Verwenden Sie einfach toDateString () an beiden Daten. toDateString enthält keine Uhrzeit, daher sind die Werte für 2 Mal am selben Datum gleich, wie unten gezeigt.

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

Offensichtlich sind einige der Zeitzonenbedenken, die an anderer Stelle zu dieser Frage geäußert wurden, gültig, aber in vielen Szenarien sind diese nicht relevant.

Mike Feltman
quelle
1
In meinem Fall ist diese Lösung viel besser als die ausgewählte Antwort und die Antworten mit mehr Stimmen. Im Titel "Ohne Zeitvergleich" wird ausdrücklich darauf hingewiesen, dass diese Lösung genau dies tut, sodass keine Zeit für die Bearbeitung des Vergleichs festgelegt werden muss. Um zu antworten, ob "Ereignis X und Ereignis Y am selben Tag stattgefunden haben", ist es sinnvoller, nur das Datum zu vergleichen, als zu antworten: "Ist 00: 00: 00.00 Uhr des Datums von Ereignis X genau gleich mit 00:00: 00.00 des Datums der Veranstaltung Y? " Das ist, was viele andere Antwortende tun
Mr.K
3

So mache ich das:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}
Fabrizio
quelle
Ich verwende dies derzeit in der Produktion und habe keine Probleme oder Browser-Inkompatibilitäten usw. Gibt es Gründe, warum Sie sagen, dass dies getTime()erforderlich ist?
Fabrizio
5
Beachten Sie, dass setHours()das aufgerufene Objekt geändert wird und das Datum in Millisekunden zurückgegeben wird (entspricht dem Aufruf getTime()). Daher ist Ihre todayVariable kein DateObjekt, wie manche es erwarten würden, sondern eine ganzzahlige Anzahl von Millisekunden. Als Nebeneffekt war dies der Grund, warum Sie getTime()vor dem Vergleich nicht anrufen mussten , da Sie dies bereits auf dunkle Weise getan haben.
Timothy Walters
3

Da ich hier keinen ähnlichen Ansatz sehe und es mir nicht Spaß macht, h / m / s / ms auf 0 zu setzen, da dies Probleme beim genauen Übergang in die lokale Zeitzone mit geändertem dateObjekt verursachen kann (nehme ich an), lassen Sie mich Stellen Sie hier Folgendes vor, geschrieben vor wenigen Augenblicken, lil function:

+: Einfach zu bedienen, führt grundlegende Vergleichsoperationen durch (Vergleich von Tag, Monat und Jahr ohne Zeit)
-. Es scheint, dass dies ein völliges Gegenteil von "out of the box" -Denken ist.

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

Verwendungszweck:

datecompare(date1, '===', date2)für Gleichheitsprüfung,
datecompare(date1, '>', date2)für größere Prüfung,
!datecompare(date1, '>', date2)für weniger oder gleiche Prüfung

Natürlich können Sie auch wechseln date1und date2stellenweise einen anderen einfachen Vergleich durchführen.

Max Yari
quelle
Nizza plus plus hat mir geholfen, jetzt hoffentlich beißen die ISO-Konvertierungen nicht, haha, danke.
Edencorbin
3

Eine effiziente und korrekte Methode zum Vergleichen von Daten ist:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

Es ignoriert den Zeitteil, funktioniert für verschiedene Zeitzonen und Sie können auch die Gleichheit vergleichen ==. 86400000 ist die Anzahl der Millisekunden pro Tag ( = 24*60*60*1000).

Beachten Sie, dass der Gleichheitsoperator ==sollte nie zum Vergleichen Date - Objekte verwendet werden , da es , wenn nicht Sie einen Gleichheitstest zur Arbeit erwarten würden , weil es zwei Date - Objekte vergleicht (und nicht zu vergleichen , die zwei Daten) zB:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

Hinweise: Wenn Sie Datumsobjekte vergleichen, bei denen der Zeitteil auf Null gesetzt ist, können Sie diese verwenden, date1.getTime() == date2.getTime()aber die Optimierung lohnt sich kaum. Sie können verwendet werden <, >, <=, oder >=wenn Datum zu vergleichen Objekte direkt , weil diese Operatoren zuerst das Date - Objekt konvertieren durch den Aufruf , .valueOf()bevor der Bediener den Vergleich der Fall ist.

Robocat
quelle
2

Nachdem ich diese Frage ungefähr zur gleichen Zeit gelesen habe, nachdem sie veröffentlicht wurde, habe ich beschlossen, eine andere Lösung zu veröffentlichen, da ich sie zumindest für meine Bedürfnisse nicht so zufriedenstellend fand:

Ich habe so etwas benutzt:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

Auf diese Weise hätte ich die Daten in dem Format verwenden können, das ich für die anschließende Verarbeitung wollte. Aber das war nur für meine Bedürfnisse, aber ich habe beschlossen, es trotzdem zu posten, vielleicht hilft es jemandem

Aleks
quelle
1
Bitte beachten Sie, dass Ihre currentDateVariable kein Datum ist, sondern eine Anzahl von Millisekunden seit dem 01.01.1970. Die setHours()Methode ändert das Datumsobjekt, für das es aufgerufen wird, und gibt das Äquivalent von getTime()(Wert des Datums in Millisekunden seit dem 01.01.1970) zurück.
Timothy Walters
1

userDateStellen Sie sicher, dass Sie mit einem 4-stelligen Jahr als konstruieren setFullYear(10, ...) !== setFullYear(2010, ...).

Alex K.
quelle
1

Sie können eine Arithmetik mit der Summe von ms verwenden.

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

Ich mag das, weil keine Aktualisierungen der ursprünglichen Daten vorgenommen werden und schneller ausgeführt werden als das Teilen und Vergleichen von Zeichenfolgen.

Ich hoffe das hilft!

Miguel
quelle
1

Dieser JS ändert den Inhalt nach dem festgelegten Datum. Hier ist das Gleiche, aber auf w3schools

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->

NICHOLAS WOJNAR
quelle
1

Das funktioniert bei mir:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

In der akzeptierten Antwort liegt ein Zeitzonenproblem vor und in der anderen Zeit ist es nicht 00:00:00

Yogesh Devgun
quelle
0

Ich weiß, dass diese Frage bereits beantwortet wurde und dies möglicherweise nicht der beste Weg ist, aber in meinem Szenario funktioniert es perfekt, daher dachte ich, es könnte jemandem wie mir helfen.

wenn du date stringals hast

String dateString="2018-01-01T18:19:12.543";

und Sie möchten nur den Datumsteil mit einem anderen Datumsobjekt in JS vergleichen,

var anotherDate=new Date(); //some date

dann müssen Sie convertdas stringzu DateAufgabe durch die Verwendungnew Date("2018-01-01T18:19:12.543");

und hier ist der Trick: -

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

Ich habe verwendet toDateString()vonDate object JS, die nur das Datum String zurückgibt.

Hinweis: Vergessen Sie nicht, die zu verwenden .valueOf() Funktion beim Vergleichen der Daten zu verwenden.

Weitere Infos zu finden Sie .valeOf()hier Referenz

Viel Spaß beim Codieren.

RK Sharma
quelle
0

Das wird helfen. Ich habe es geschafft, es so zu bekommen.

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
Hiran DA Walawage
quelle
0

Vergleichen mit setHours()wird eine Lösung sein. Stichprobe:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}
Chandrashekhar Kase
quelle
0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

Wenn Ihr Datumsformat anders ist, verwenden Sie moment.js Bibliothek , um das Format Ihres Datums zu konvertieren, und verwenden Sie dann den obigen Code, um zwei zu vergleichen

Beispiel:

Wenn sich Ihr Datum in "TT / MM / JJJJ" befindet und es in "MM / TT / JJJJ" konvertieren möchte, sehen Sie sich das folgende Codebeispiel an

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);
Pritesh Singh
quelle
0

Sie können fp_incr (0) verwenden. Dadurch wird der Zeitzonenanteil auf Mitternacht gesetzt und ein Datumsobjekt zurückgegeben.

user2849789
quelle