it-swarm.com.de

Vergleich des Datumsteils ohne Vergleich der Zeit in JavaScript

Was stimmt nicht mit dem folgenden Code?

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

Übrigens, wenn ich die beiden Daten in einer Benachrichtigung anzeige, zeigen sie genau dasselbe.

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, Datumsangaben zu vergleichen und die Zeit nicht zu berücksichtigen?

305
moleculezz

Ich lerne immer noch JavaScript, und die einzige Möglichkeit, die ich gefunden habe, um zwei Datumsangaben ohne Zeitangabe zu vergleichen, besteht darin, die setHours - Methode des Date-Objekts zu verwenden und die Stunden einzustellen. Minuten, Sekunden und Millisekunden auf Null. Vergleichen Sie dann die beiden Daten.

Zum Beispiel,

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

date2 wird mit Stunden, Minuten, Sekunden und Millisekunden auf Null gesetzt, aber bei Datum1 werden sie auf den Zeitpunkt gesetzt, zu dem Datum1 erstellt wurde. Um die Stunden, Minuten, Sekunden und Millisekunden von Datum1 zu löschen, gehen Sie wie folgt vor:

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

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

665
nexar

Hüten Sie sich vor der Zeitzone

Wenn Sie das Datumsobjekt verwenden, um nur ein Datum sofort darzustellen, stoßen Sie auf 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 hat keine Ahnung von Zeitzone. Dies ist ein Moment (seit der Epoche ankreuzen) 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 just-a-date ™ mit einem Datumsobjekt darzustellen, Sie möchten, dass Ihre Datumsangaben zu Beginn des betreffenden Datums UTC-Mitternacht darstellen. Dies ist eine übliche und notwendige Konvention, mit der Sie mit Datumsangaben arbeiten können unabhängig von der Jahreszeit oder Zeitzone ihrer Entstehung. Sie müssen also sehr wachsam sein, um den Begriff der Zeitzone zu verwalten, sowohl beim Erstellen des UTC-Datums mit Mitternacht als auch beim Serialisieren.

Viele Leute sind durch das Standardverhalten der Konsole verwirrt. Wenn Sie ein Datum auf die Konsole übertragen, enthält die angezeigte Ausgabe Ihre Zeitzone. Dies liegt nur daran, dass die Konsole toString() zu Ihrem Datum aufruft und toString() Ihnen eine lokale Darstellung gibt. Das zugrunde liegende Datum hat keine Zeitzone! (Solange die Zeit mit dem Zeitzonenoffset übereinstimmt, haben Sie noch ein UTC-Datumsobjekt für Mitternacht.)

Deserialisieren (oder Erstellen von Mitternacht-UTC-Datumsobjekten)

In den meisten Fällen möchten Sie, dass Ihr Datum die Zeitzone des Benutzers widerspiegelt. Klick wenn heute dein 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 ist internationale Vergleichbarkeit wichtiger als 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()));

Datum deserialisieren

Daten auf dem Draht haben häufig das Format JJJJ-MM-TT. So deserialisieren Sie sie:.

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 nicht angezeigt wird, wenn Sie wieder in eine Zeichenfolgendarstellung konvertieren. 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.

nd alles andere meiden, besonders ...

  • getYear(), getMonth(), getDate()

Also, 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>

Siehe es läuft ...

84
bbsimonbb

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
61
AdEpt

Moment.js verwenden

Wenn Sie die Möglichkeit haben, eine Bibliothek eines Drittanbieters hinzuzufügen, lohnt es sich auf jeden Fall einen Blick auf Moment.js zu werfen. Es macht die Arbeit mit Date und DateTime sehr viel einfacher.

Wenn Sie beispielsweise nachsehen, ob ein Datum hinter einem anderen Datum liegt, jedoch deren Zeiten ausschließen, 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 isAfter übergeben, ist die Genauigkeit für den Vergleich und kann year, month, week, day, hour, minute oder second sein.

17
Joshua Pinter

Vergleichen Sie einfach mit .toDateString wie folgt:

new Date().toDateString();

Dadurch wird nur der Datumsteil und nicht die Uhrzeit oder Zeitzone wie folgt angezeigt:

"Fri Feb 03 2017"

Somit können beide Datumsangaben in diesem Format ebenfalls ohne Zeitteil verglichen werden.

9
Rahi

Dies kann eine etwas sauberere Version sein. Beachten Sie auch, dass Sie bei der Verwendung von parseInt immer eine Basis 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);
    }
});

Überprüfen Sie die MDC parseInt - Seite, um weitere Informationen zur Radix zu erhalten.

JSLint ist ein großartiges Werkzeug, um Dinge wie ein fehlendes Radix zu erfassen und viele andere Dinge, die dunkle und schwer zu debuggende Fehler verursachen können. Sie zwingen Sie, bessere Codierungsstandards zu verwenden, um zukünftige Kopfschmerzen zu vermeiden. Ich verwende es für jedes JavaScript-Projekt, das ich codiere.

8
Useless Code

Die Bibliothek date.js ist für diese Dinge hilfreich. Es vereinfacht das JS-Datums-Scriping erheblich.

So mache ich es:

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();
    });
}
3
Fabrizio

Da ich hier keine ähnliche Vorgehensweise sehe, genieße ich es nicht, h/m/s/ms auf 0 zu setzen, da dies zu Problemen beim genauen Übergang zur lokalen Zeitzone mit geändertem date-Objekt führen kann (nehme ich an) Ich stelle mir hier vor, das vor wenigen Momenten geschrieben, lil Funktion:

+: Einfach zu bedienen, macht grundlegende Vergleichsoperationen (Vergleich von Tag, Monat und Jahr ohne Zeit).
-: Es scheint, dass dies ein vollkommenes Gegenteil von "out of the box" 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 die Gleichheitsprüfung
datecompare(date1, '>', date2) zur genaueren Prüfung,
!datecompare(date1, '>', date2) für weniger oder gleiche Prüfung 

Natürlich können Sie auch date1 und date2 stellenweise ändern, um andere einfache Vergleiche zu erhalten.

3
Max Yari

Ein effizienter und korrekter Weg, Datumsangaben zu vergleichen, ist:

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

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

Beachten Sie, dass der Gleichheitsoperator == für den Vergleich von Date-Objekten never verwendet werden sollte, da er fehlschlägt, wenn Sie erwarten würden, dass ein Gleichheitstest funktioniert, da er zwei Date-Objekte vergleicht (und nicht die beiden Datumsangaben vergleicht), z.

> 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 Date-Objekte vergleichen, für die der Zeitteil auf Null gesetzt ist, können Sie date1.getTime() == date2.getTime() verwenden. Die Optimierung lohnt sich jedoch kaum. Sie können <, >, <= oder >= verwenden, um Date-Objekte direkt zu vergleichen, da diese Operatoren das Date-Objekt zuerst konvertieren, indem Sie .valueOf() aufrufen, bevor der Operator den Vergleich durchführt.

2
robocat

Wenn Sie wirklich nur das Datum ohne Zeitkomponente vergleichen, besteht eine andere Lösung, die sich möglicherweise falsch anfühlt, aber alle Date() Zeit- und Zeitzonenprobleme vermeidet, darin, das ISO-String-Datum direkt mit dem String-Vergleich 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 Folgendes verwenden:

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

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

1
brittohalloran

Sie können einige Berechnungen 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 Datumsangaben vorgenommen werden und schneller als das Teilen und Vergleichen von Strings sind.

Ich hoffe das hilft!

1
Miguel

Stellen Sie sicher, dass Sie userDate mit einer 4-stelligen Jahreszahl als setFullYear(10, ...) !== setFullYear(2010, ...) erstellen.

1
Alex K.

Nachdem ich diese Frage ziemlich gleich nach der Veröffentlichung gelesen hatte, habe ich mich entschlossen, eine andere Lösung zu posten, da ich sie zumindest für meine Bedürfnisse nicht ganz zufriedenstellend fand:

Ich habe so etwas verwendet:

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 Datumsangaben in dem Format verwenden können, das ich für die Bearbeitung später verwenden wollte. Dies war jedoch nur für meine Bedürfnisse, aber ich habe mich entschlossen, es trotzdem zu posten, vielleicht wird es jemandem helfen

1
Aleks

Diese JS wird den Inhalt nach dem festgelegten Datum ändern 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 <-->
0
NICHOLAS WOJNAR

Ein Vergleich mit setHours() wird eine Lösung sein. Probe:

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)
}
0
Chandrashekhar

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

0
user2849789

Verwenden Sie an beiden Daten einfach toDateString (). In toDateString ist die Uhrzeit nicht enthalten. Daher sind die Werte für zwei 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 werden, gültig, aber in vielen Szenarien sind diese nicht relevant.

0
Mike Feltman
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, konvertieren Sie das Format Ihres Datums mit moment.js library und verwenden Sie den obigen Code, um zwei Datumsangaben zu vergleichen

Beispiel:

Wenn sich Ihr Datum in "TT/MM/JJJJ" befindet und es in "MM/TT/JJJJ" konvertiert werden soll, lesen Sie das folgende Codebeispiel

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);

0
Pritesh Singh

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

wenn Sie date string als haben 

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

und Sie möchten nur den Datumsteil mit einem anderen Date-Objekt in JS vergleichen,

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

dann müssen Sie convert das Objekt string in Date mithilfe von new 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 toDateString() von Date object von JS verwendet, das nur den Date-String zurückgibt. 

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

weitere Informationen zu .valeOf() finden Sie hier reference

Glückliches Codding.

0
R K Sharma

Das wird helfen. Ich habe es so geschafft. 

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
0