2016-11-11 1 views
1

Ich versuche, meinen Code zu stören und fand ein seltsames Date-Problem für js, ich kann nicht verstehen. Auf den Entwickler-Tools von Chrom, beobachten Sie den Wert dieses Ausdrucks:Seltsames Date-Problem für Javascript

new Date(new Date() + (-1) * 60 * 1000).getTime() 

Sie Wert bekam werden ‚NaN‘. diese

Und wenn Uhr:

new Date(new Date() + (-1) * 60 * 100).getTime() 

Sie bekam Wert '1479095577000'.

Warum?

+2

Sie möchten wahrscheinlich "Date.now()" anstelle von "new Date()" verwenden. 'new Date(). toString()' gibt eine Zeichenkette zurück, und wenn Sie '+ (-1)' tun, verkettet es anstatt zu addieren. Also gibt es etwas wie "Fr 11. November 2016 00:02:59 GMT-0800 (Pacific Standard Time) -60000" – mash

+0

@mash, aber warum funktioniert dann der zweite Code? – KWeiss

+0

@KWeiss ehrlich gesagt keine Ahnung, aus irgendeinem Grund "Fr 11. November 2016 00:05:05 GMT-0800 (Pacific Standard Time) -1000" ist ein gültiges Datum, aber "Fr 11 November 2016 00:05:05 GMT-0800 (Pacific Standard Time) -10000 "ist nicht. Nicht wirklich sicher, wie die Zahlen nach dem - als geparst werden. – mash

Antwort

1

Die Date-Objekt mit doe sn't Überladung +, so new Date() + n verkettet einfach beide Operanden als Strings.

Eg:

new Date() + (-1) * 60 * 1000 

entspricht

String(new Date()) + String((-1) * 60 * 100) 

und Ausbeuten (je nach locale)

Fri Nov 11 2016 09:05:43 GMT+0100-6000 

Das zweite Beispiel ergibt einen Wert, weil die "-6000" Looks wie ein Zeitzonenmodifikator, der 60 Stunden subtrahiert, obwohl es bereits einen gibt. Dies ist eine Parsing-Eigenart von Chrome - Firefox wird es ablehnen, aber Chrome wird die "-6000" akzeptieren und ein Datum sechzig Stunden in der Zukunft ergeben.

Dies funktioniert nur, wenn die angehängte Zeichenfolge genau vier Ziffern (die ersten zwei Ziffern für die Stunden, zwei für die Minuten) und hat entweder ein + oder ein - davor. Deshalb funktioniert es, wenn Sie "-6000", aber nicht "-60000" hinzufügen. Es würde auch nicht mit positiven Zahlen funktionieren, es sei denn, Sie haben das "+" Zeichen manuell hinzugefügt.

Ich vermute, dass das, was Sie eigentlich wollen

Date.now() - 60 * 1000 
+0

Ob ein Ausdruck ein gültiges Date zurückgibt, hängt vollständig von der Implementierung ab. Keiner der Ausdrücke gibt ein gültiges Datum in Safari zurück. – RobG

+0

Ja, da die Zeichenfolge kein gültiges Datum darstellt, gibt es kein wohldefiniertes Browserverhalten. Ich habe einige überprüft und es scheint, dass Chrome alleine die Syntax akzeptiert. –

2
  • new Date() + (-1) - das Datum in einen String konvertiert werden, dann ist "-1" es verketteten, die ein gültiges Datum ist, weil Sie einige Zeitzone
  • new Date() + (-1) * 60 * 100 = new Date() + (-1 * 60 * 100) = new Date() + (-6000) versetzt sind Subtrahieren - das auch ein gültiges Datum minus Zone einige Zeit
  • aber dann ein Datum minus 60000 Verschiebung ist kein gültiges Datum, aufgrund der Zeitzonen nur 4 Ziffern oben
+1

Awesome answer. Ich versuche, den Grenzwert zu finden. neues Datum ('Fr 11. November 2016 16:11:01 GMT + 0800 (China Standard Time) -9999'); Es ist OK. neues Datum ('Fr 11. November 2016 16.11.01 GMT + 0800 (China Standard Time) -10000'); Aber nicht das Obige, es könnte Arhaks Schlussfolgerung beweisen. Und auch ich andere versuchen, habe die folgenden Regeln. 1. Wenn das Ende der Nummer einstellig oder zweistellig ist, bedeutet es Stunde. 2. Wenn das Ende der Nummer dreistellig oder vierdigital ist, bedeuten die letzten zwei Ziffern die Minute, die erste 1 oder 2 Ziffern die mittlere Stunde. – Eason

0

ist Wie andere gesagt haben, das Problem ist, dass die erste + String-Verkettung bewirkt eher als Ergänzung. Sie können beheben, die mit Date.now() oder:

// Use unary + 
 
console.log(new Date(+new Date() + (-1) * 60 * 1000).getTime()); 
 

 
// Replacing `+` with `-` 
 
console.log(new Date(new Date() - 1 * 60 * 1000).getTime());

Die oben zurückkehren kann leicht unterschiedliche Ergebnisse (± 2 ms oder so) aufgrund der Leistung der SO-Konsole.

Beachten Sie, ob new Date(new Date() + (-1) * 60 * 1000).getTime()) ein gültiges Datum zurückgibt oder nicht, ist vollständig abhängig von der Implementierung. Safari gibt ein ungültiges Datum für beide Ausdrücke im OP zurück.

Verwandte Themen