2016-04-10 13 views
2

Ich bekomme ein SQL-Datum - NICHT Datetime - Objekt in meinen Javascript-Code geschoben, und ich muss sehen, ob es vor heute ist oder nicht. Hier ist der Code, den ich habe (der relevante Teil):Javascript Datum Vergleich verhält sich nicht wie erwartet

todaysDate = new Date(); 
todaysDate.setHours(0,0,0,0); 
var date = Date.parse(row[3]); 
// date.setHours(0,0,0,0); 
if (date < todaysDate) { 
    alert("date is before today"); 
    dueDate = '<small class="text-danger">'; 
} else { 
    alert("date is after today"); 
    dueDate = '<small class="text-muted">'; 
} 

Zeile [3] ist die Quelle des SQL-Datums. Also, das funktioniert gut für alles außer Daten, die heute sind. Ohne die kommentierte Zeile denkt es, dass alles mit dem heutigen Datum in der Vergangenheit liegt. Mit der kommentierten Zeile bricht mein Code ab. Irgendwelche Gedanken, wie das zu beheben ist? Ich bin mir nicht sicher, was ich falsch mache.

Danke!

+0

heute sollte Text-Gefahr oder Text-stummgeschaltet werden? Hast du 'new Date (row [3])' ausprobiert? –

+0

Das Analysieren von Zeichenfolgen mit dem Date-Konstruktor und * Date.parse * ist unzuverlässig und führt oft zu unerwarteten Ergebnissen. Es ist unmöglich zu sagen, was passiert, wenn Sie den tatsächlichen Wert von 'row [3]' nicht preisgeben.Beachten Sie, dass in Browsern, die ECMAScrip 2015 entsprechen, eine Zeichenfolge wie "2016-04-10" als UTC behandelt wird. Wenn Sie sich also westlich von UTC befinden, erhalten Sie möglicherweise ein Datum für den 9. April. Einige werden es weiterhin als lokal und einige als ungültig behandeln. – RobG

+0

Yeah @RobG es ist das String-Format, das Sie erwähnt haben - YYYY-MM-DD, also denke ich, dass es das UTC-Problem ist, das Sie erwähnten. Ich überprüfe den Code, den du unten gepostet hast! Und Daniel, um zu klären, sollte heute gedämpft sein, nicht Gefahr. Ich möchte heute NICHT in diese erste if-Anweisung aufgenommen werden. – dangr

Antwort

3

Wenn Ihre Datumszeichenfolge wie "2016-04-10" ist und Ihre Zeitzone westlich von GMT liegt, z. B. -04: 00, erhalten Sie in Browsern, die ECMAScript 2016 entsprechen, ein Datum für "2016-04- 09T19: 00: 00-0400 ".

Wenn Sie ein Datum mit new Date() erstellen und die Stunden auf Null setzen (vorausgesetzt, Sie haben den 10. April erreicht), erhalten Sie ein Datum für "2016-04-10T00: 00: 00-0400".

Im Vergleich haben sie unterschiedliche Zeitwerte.

Was Sie brauchen, ist, um entweder die Zeichenfolge, die Sie aus der Datenbank als lokale bekommen zu behandeln, oder nutzen Sie die UCT Zeitpunkt, wo Sie sind, so:

var dateString = '2016-04-10'; 
 
var parsedDate = new Date(dateString); 
 

 
var todayUTCDate = new Date(); 
 
todayUTCDate.setUTCHours(0,0,0,0); 
 

 
document.write(parsedDate + '<br>' + todayUTCDate);

Aber nicht alle Browser analysieren Zeichenfolgen gemäß ECMAScript 2015, sodass sie immer manuell analysiert werden sollten. Verwenden Sie eine Bibliothek oder schreiben Sie eine kleine Funktion, z.

// Parse date string in format 'yyyy-mm-dd' as local date 
function parseISOLocal(s) { 
    var b = s.split(/\D/); 
    return new Date(b[0], b[1]-1, b[2]); 
} 

und ersetzen:

var date = Date.parse(row[3]); 

mit:

var date = parseISOLocal(row[3]); 

und dann im Vergleich, zu vergleichen, um die Zeitwerte:

if (+date < +todaysDate) { 

oder

if (date.getTime() < todaysDate.getTime()) { 
+0

Das hat perfekt funktioniert - danke !! – dangr

+0

Obwohl vergessen zu erwähnen - enge Klammer fehlt in der Return-Anweisung, für jeden, der später darauf kommt. – dangr

+0

@ dangr-fixed ... – RobG

0

Verwenden Sie getTime() des Datumsobjekts.

Die Methode getTime() gibt die Anzahl der Millisekunden zwischen Mitternacht des 1. Januar 1970 und dem angegebenen Datum zurück.

können Sie miliseconds vergleichen und Ihren Betrieb

date.getTime() > todaysDate.getTime() 

auch sicher sein, dass Sie Date.parse ein gültiges Datum zurückkehrt.

+0

Das ist einfach falsch. '>', '<', '> =' und '<=' sind direkt zwischen Daten anwendbar. – Chiru

Verwandte Themen