new Date() funktioniert in Chrome, aber nicht in Firefox
Lesezeit: 7 Minuten
Pixeldev
Ich erstelle eine Datetime-Zeichenfolge, die so aussieht: 2010-07-15 11:54:21
Und mit dem folgenden Code erhalte ich ein ungültiges Datum in Firefox, funktioniert aber in Chrome einwandfrei
var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);
In Firefox gibt mir date1 ein ungültiges Datum, aber in Chrome funktioniert es einwandfrei, was wäre die Hauptursache?
wenn Sie damit spielen möchten, wie Sie wollen datejs.com
– Sinan
15. Juli 2010 um 16:12 Uhr
Nicht alle Implementierungen unterstützen das Format in ECMA-262, also analysieren Sie Zeichenfolgen immer manuell (eine Bibliothek kann helfen, ist aber wahrscheinlich nicht für einzelne Formate erforderlich).
– RobG
6. April 2016 um 23:08 Uhr
Firefox funktioniert jetzt.
– Sm Yamashita
9. Juni 2016 um 7:59 Uhr
Chris Laplante
Sie können ein Datumsobjekt nicht beliebig instanziieren. Es muss auf eine bestimmte Art und Weise geschehen. Hier sind einige gültige Beispiele:
new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)
oder
d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)
Ich habe eine Lösung, die in allen Browsern einschließlich Firefox funktioniert: stackoverflow.com/a/21984717/586051
– Rahul Desai
24. Februar 2014 um 11:45 Uhr
Warum es diesen Browser-Unterschied gibt: die EMCAScript-Spezifikation erfordert genau ein Datumsformat (dh, YYYY-MM-DDTHH:mm:ss.sssZ) aber benutzerdefinierte Datumsformate können von einer Implementierung frei unterstützt werden: “Wenn der String dem nicht entspricht [ECMAScript-defined] format kann die Funktion auf beliebige implementierungsspezifische Heuristiken oder implementierungsspezifische Datumsformate zurückgreifen.„Chrome und FF haben einfach unterschiedliche „implementierungsspezifische Datumsformate“.
– Apsiller
15. September 2014 um 14:37 Uhr
Ein Beispiel für ein Datumsformat (Monat mit einem „.“), das in Chrome, aber nicht in Firefox funktioniert: „Feb. 14., 2019′
– codecribblr
26. Oktober 2018 um 17:15 Uhr
Dies funktionierte bei mir nur in Firefox, wenn ich hinzufügte ' zu Millisekunden Date('milliseconds') Ansonsten bekam ich eine Fehlermeldung, dass Millisekunden nicht definiert waren, aber es funktionierte zumindest, wo viele andere Versuche fehlschlugen. In Chrome scheint es immer noch glücklich zu sein.
Du hast also tatsächlich getestet alle Browser? Und falls ja, wissen Sie auch, dass alle Browser in Zukunft auch dieses (Nicht-Standard-)Format unterstützen werden?
– RobG
19. März 2014 um 5:15 Uhr
Das funktioniert für mich. Wenn Sie also bereits eine Zeichenfolge von ‘2001-1-31 12:00:00’ erhalten, können wir einfach Folgendes tun: new Date(str.replace(/-/g, ‘/’));
– Jianwu Chen
10. Mai 2016 um 22:13 Uhr
@JianwuChen Sie ändern absichtlich ein Standardformat in ein Nicht-Standardformat. Keine gute Idee.
– JJJ
16. Juni 2016 um 9:13 Uhr
Nach 3 Jahren funktioniert es nicht auf Edge und Windows Safari.
– MgThar
14. November 2016 um 7:22 Uhr
Option 1 :
Angenommen, Ihr Zeitstring hat ein Format, das wie folgt aussieht:
'2016-03-10 16:00:00.0'
In diesem Fall könnten Sie eine einfache Regex zum Konvertieren verwenden ISO 8601 :
'2016-03-10 16:00:00.0'.replace(/ /g,'T')
Dies würde die folgende Ausgabe erzeugen:
'2016-03-10T16:00:00.0'
Dies ist das Standard-Datetime-Format und wird daher von allen Browsern unterstützt:
document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE
Option 2 :
Angenommen, Ihr Zeitstring hat ein Format, das wie folgt aussieht:
Auch dies erzeugt ein Format, das von allen Browsern unterstützt wird:
document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE
Möglichkeit 3:
Angenommen, Sie haben eine Zeitfolge, die nicht einfach an einen der gut unterstützten Standards angepasst werden kann.
In diesem Fall ist es am besten, Ihre Zeitzeichenfolge einfach in verschiedene Teile aufzuteilen und sie als individuelle Parameter für zu verwenden Date :
document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE
var d = new Date(‘2017-08-28 08:02 PM’.replace(/-/g,’/’)); Dies funktioniert bei mir sowohl in Chrome als auch in Mozilla perfekt.
– Rahul Mankar
28. August 2017 um 14:33 Uhr
Alvis
Dies funktioniert auch in den meisten Browsern
new Date('2001/01/31 12:00:00')
Das ist das Format von
"yyyy/MM/dd HH:mm:ss"
Gabrielius
Wenn Sie das Datum dennoch mit Bindestrichen erstellen möchten, können Sie dieses Format verwenden:
var date = new Date('2013-08-31T17:00:00Z')
Aber bedenken Sie, dass es Zeit gemäß UTC erstellt. Das heißt, wenn Sie in der Zeitzone GMT+3 (3 Stunden vor GMT) leben, wird dieser Zeitzonen-Offset zur Uhrzeit hinzugefügt. Das obige Beispiel hat also diesen Wert, wenn GMT+3 (beachten Sie, dass es Stunde 20:00 und nicht 17:00 ist):
Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)
Stellen Sie sicher, dass Sie am Ende den Buchstaben „Z“ hinzufügen, da Chrome und Firefox die Zeichenfolge sonst unterschiedlich analysieren (einer fügt einen Zeitversatz hinzu und der andere nicht).
Ja, Chrome und Firefox verhalten sich anders, wenn Sie keine Zeitzone angeben. Und aus Interesse denke ich, dass Firefox es falsch macht. Es sollte GMT annehmen, wenn die Zeitzone fehlt. Chrome tut es, Firefox nicht. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
– Julian Jelfs
8. Mai 2014 um 10:07 Uhr
@JulianJelfs—”Es sollte GMT annehmen, wenn die Zeitzone fehlt“, nur für Datum (im Gegensatz zu ISO 8601). Für Datums- und Zeitzeichenfolgen sollte es lokal annehmen (in Übereinstimmung mit ISO 8601). Aber in jedem Fall ist manuelles Parsen der einzig sichere Weg.
– RobG
6. April 2016 um 23:16 Uhr
Zakaria Acharki
Ich hatte ein ähnliches Problem in Firefox und Safari, als ich mit AngularJS arbeitete. Wenn beispielsweise ein von Angular zurückgegebenes Datum so aussah:
2014-06-02 10:28:00
mit diesem Code:
new Date('2014-06-02 10:28:00').toISOString();
gibt einen ungültigen Datumsfehler in Firefox und Safari zurück. In Chrome funktioniert es jedoch einwandfrei. Wie in einer anderen Antwort angegeben, ist Chrome höchstwahrscheinlich nur flexibler beim Analysieren von Datumszeichenfolgen.
Mein letztendliches Ziel war es, das Datum auf eine bestimmte Weise zu formatieren. Ich habe eine ausgezeichnete Bibliothek gefunden, die sowohl das Problem der browserübergreifenden Kompatibilität als auch das Problem der Datumsformatierung behandelt. Die Bibliothek wird aufgerufen moment.js.
Mit dieser Bibliothek funktioniert der folgende Code in allen von mir getesteten Browsern korrekt:
moment('2014-06-02 10:28:00').format('MMM d YY')
Wenn Sie bereit sind, diese zusätzliche Bibliothek in Ihre App aufzunehmen, können Sie Ihre Datumszeichenfolge einfacher erstellen und gleichzeitig mögliche Probleme mit der Browserkompatibilität vermeiden. Als Bonus haben Sie eine gute Möglichkeit, Daten bei Bedarf einfach zu formatieren, zu addieren, zu subtrahieren usw.
Ja, Chrome und Firefox verhalten sich anders, wenn Sie keine Zeitzone angeben. Und aus Interesse denke ich, dass Firefox es falsch macht. Es sollte GMT annehmen, wenn die Zeitzone fehlt. Chrome tut es, Firefox nicht. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
– Julian Jelfs
8. Mai 2014 um 10:07 Uhr
@JulianJelfs—”Es sollte GMT annehmen, wenn die Zeitzone fehlt“, nur für Datum (im Gegensatz zu ISO 8601). Für Datums- und Zeitzeichenfolgen sollte es lokal annehmen (in Übereinstimmung mit ISO 8601). Aber in jedem Fall ist manuelles Parsen der einzig sichere Weg.
– RobG
6. April 2016 um 23:16 Uhr
Kevin Panko
Das sollte für Sie funktionieren:
var date1 = new Date(year, month, day, hour, minute, seconds);
Ich musste das Datum aus einer Zeichenfolge erstellen, also habe ich es so gemacht:
var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
Denken Sie daran, dass die Monate in Javascript von 0 bis 11 reichen, also sollten Sie den Monatswert wie folgt um 1 reduzieren:
var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
8681900cookie-checknew Date() funktioniert in Chrome, aber nicht in Firefoxyes
wenn Sie damit spielen möchten, wie Sie wollen datejs.com
– Sinan
15. Juli 2010 um 16:12 Uhr
Nicht alle Implementierungen unterstützen das Format in ECMA-262, also analysieren Sie Zeichenfolgen immer manuell (eine Bibliothek kann helfen, ist aber wahrscheinlich nicht für einzelne Formate erforderlich).
– RobG
6. April 2016 um 23:08 Uhr
Firefox funktioniert jetzt.
– Sm Yamashita
9. Juni 2016 um 7:59 Uhr