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?
quelle
date1 === date2
kein konsistentes Verhalten zu bieten scheint. es ist besser zu tundate1.valueOf() === b.valueOf()
oder sogardate1.getTime() === date2.getTime()
. Fremdheit.var date2 = new Date(2011,8,20)
. Ändern Sie nun die Zeitzone des Betriebssystems in Pacific Time (US). Im gleichen Browser-Konsolentyp erhaltendate2.toDateString()
SieMon Sep 19 2011
statt Dienstag den 20. zurück!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
setUTCxxx
Methoden anstelle der lokalen / zeitzonenbewussten Varianten zu verwenden.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 undtoString()
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 ...
Manchmal übertrifft die internationale Vergleichbarkeit die lokale Genauigkeit. In diesem Fall tun Sie dies ...
Deserialisieren Sie ein Datum
Oft haben Daten auf dem Draht das Format JJJJ-MM-TT. Um sie zu deserialisieren, tun Sie dies ...
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 ...
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.
quelle
Wie wäre es damit?
Sie können den Datumsteil des Datums wie folgt vergleichen, ohne den Wert Ihrer Variablen zu beeinflussen:
quelle
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
Date
undDateTime
viel, viel einfacher.Wenn Sie beispielsweise sehen, ob ein Datum nach dem anderen kommt, aber deren Zeiten ausschließt, würden Sie Folgendes tun:
Der zweite Parameter , den Sie in Pass
isAfter
ist die Genauigkeit des Vergleichs zu tun und jeder sein kannyear
,month
,week
,day
,hour
,minute
odersecond
.quelle
Vergleichen Sie einfach mit .toDateString wie folgt:
Dadurch erhalten Sie nur einen Datums-Teil und keine Zeit oder Zeitzone wie folgt:
Daher können beide Daten in diesem Format ebenfalls ohne Zeitanteil verglichen werden.
quelle
new Date(new Date().toDateString());
Dies ist möglicherweise eine etwas sauberere Version. Beachten Sie auch, dass Sie bei der Verwendung von parseInt immer einen Radix verwenden sollten.
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.
quelle
Die date.js- Bibliothek ist für diese Dinge praktisch. Dies erleichtert das Skripten von JS-Datumsangaben erheblich.
quelle
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:Sie können das aktuelle Datum (UTC-Datum, nicht unbedingt das lokale Datum des Benutzers) abrufen, indem Sie:
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).
quelle
new Date().toISOString().substr(0, 10) // "2019-04-22"
.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 esnew Date(new Date().toLocaleDateString())
genau mit einem anderen Datum zu vergleichen.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.
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.
quelle
So mache ich das:
quelle
getTime()
erforderlich ist?setHours()
das aufgerufene Objekt geändert wird und das Datum in Millisekunden zurückgegeben wird (entspricht dem AufrufgetTime()
). Daher ist Ihretoday
Variable keinDate
Objekt, wie manche es erwarten würden, sondern eine ganzzahlige Anzahl von Millisekunden. Als Nebeneffekt war dies der Grund, warum SiegetTime()
vor dem Vergleich nicht anrufen mussten , da Sie dies bereits auf dunkle Weise getan haben.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
date
Objekt 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.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üfungNatürlich können Sie auch wechseln
date1
unddate2
stellenweise einen anderen einfachen Vergleich durchführen.quelle
Eine effiziente und korrekte Methode zum Vergleichen von Daten ist:
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: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.quelle
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:
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
quelle
currentDate
Variable kein Datum ist, sondern eine Anzahl von Millisekunden seit dem 01.01.1970. DiesetHours()
Methode ändert das Datumsobjekt, für das es aufgerufen wird, und gibt das Äquivalent vongetTime()
(Wert des Datums in Millisekunden seit dem 01.01.1970) zurück.userDate
Stellen Sie sicher, dass Sie mit einem 4-stelligen Jahr als konstruierensetFullYear(10, ...) !== setFullYear(2010, ...)
.quelle
Sie können eine Arithmetik mit der Summe von ms verwenden.
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!
quelle
Dieser JS ändert den Inhalt nach dem festgelegten Datum. Hier ist das Gleiche, aber auf w3schools
quelle
Das funktioniert bei mir:
In der akzeptierten Antwort liegt ein Zeitzonenproblem vor und in der anderen Zeit ist es nicht 00:00:00
quelle
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 string
als hastund Sie möchten nur den Datumsteil mit einem anderen Datumsobjekt in JS vergleichen,
dann müssen Sie
convert
dasstring
zuDate
Aufgabe durch die Verwendungnew Date("2018-01-01T18:19:12.543");
und hier ist der Trick: -
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 ReferenzViel Spaß beim Codieren.
quelle
Das wird helfen. Ich habe es geschafft, es so zu bekommen.
quelle
Vergleichen mit
setHours()
wird eine Lösung sein. Stichprobe:quelle
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
quelle
Sie können fp_incr (0) verwenden. Dadurch wird der Zeitzonenanteil auf Mitternacht gesetzt und ein Datumsobjekt zurückgegeben.
quelle