new Date () funktioniert in Chrome, aber nicht in Firefox

89

Ich erstelle eine datetime-Zeichenfolge, die folgendermaßen aussieht: 2010-07-15 11:54:21

Und mit dem folgenden Code erhalte ich in Firefox ein ungültiges Datum, aber in Chrome funktioniert es einwandfrei

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

In Firefox gibt date1 mir ein ungültiges Datum, aber in Chrome funktioniert es einwandfrei. Was wäre die Hauptursache?

pixeldev
quelle
2
Wenn Sie damit spielen möchten, gehen Sie mit datejs.com
Sinan
Nicht alle Implementierungen unterstützen das Format in ECMA-262, daher werden Zeichenfolgen immer manuell analysiert (eine Bibliothek kann helfen, ist jedoch für einzelne Formate wahrscheinlich nicht erforderlich).
RobG
Es funktioniert jetzt Firefox.
Sm Yamashita

Antworten:

78

Sie können ein Datumsobjekt nicht wie gewünscht instanziieren. Es muss auf eine bestimmte Art und Weise sein. 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)

Chrome muss einfach flexibler sein.

Quelle: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Von Apsillers Kommentar:

Die EMCAScript-Spezifikation erfordert genau ein Datumsformat (dh JJJJ-MM-TTTHH: mm: ss.sssZ), aber benutzerdefinierte Datumsformate können von einer Implementierung frei unterstützt werden : " Wenn der String nicht diesem [ECMAScript-definierten] Format entspricht Die Funktion kann auf implementierungsspezifische Heuristiken oder implementierungsspezifische Datumsformate zurückgreifen. "Chrome und FF haben einfach unterschiedliche" implementierungsspezifische Datumsformate ".

Chris Laplante
quelle
3
Ich habe eine Lösung, die in allen Browsern einschließlich Firefox funktioniert
Rahul Desai
7
Warum dieser Browserunterschied besteht: 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 nicht diesem [ECMAScript-definierten] Format entspricht, kann die Funktion auf implementierungsspezifische Heuristiken oder implementierungsspezifische Datumsformate zurückgreifen. "Chrome und FF haben einfach unterschiedliche" implementierungsspezifische Datumsformate ".
Apsiller
Ein Beispiel für ein Datumsformat (Monat mit einem "."), Das in Chrome, jedoch nicht in Firefox funktioniert: 'Feb. 14, 2019 '
Codescribblr
23

Dies funktioniert in allen Browsern -

neues Datum ('2001/01/31 12:00:00 AM')

new Date('2001-01-31 12:00:00')

Format: JJJJ-MM-TTTHH: mm: ss.sss

Details: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

Tahin Rahman
quelle
weil wir alle wissen, dass dies ein internationaler Standard ist. w3.org/International/questions/qa-date-format
Bobby Tables
6
Sie haben also tatsächlich alle Browser getestet ? Und wenn Sie dies haben, wissen Sie auch, dass alle Browser in Zukunft auch dieses (nicht standardmäßige) Format unterstützen werden?
RobG
1
Das funktioniert bei mir. 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
@JianwuChen Sie ändern absichtlich ein Standardformat in ein Nicht-Standardformat. Keine gute Idee.
JJJ
2
Nach 3 Jahren funktioniert es nicht mehr auf Edge and Window Safari.
Mg Thar
13

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"
Alvis
quelle
3
Es gibt keine Garantie dafür, dass das Format in jedem Browser funktioniert, geschweige denn in "allen".
RobG
Da haben Sie Recht, die Antwort basiert auf meiner Erfahrung.
Alvis
12

Option 1 :

Angenommen, Ihr Timestring hat ein Format, das folgendermaßen aussieht:

'2016-03-10 16:00:00.0'

In diesem Fall können Sie einen einfachen regulären Ausdruck verwenden, um ihn zu konvertieren ISO 8601:

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

Dies würde die folgende Ausgabe hervorrufen:

'2016-03-10T16:00:00.0'

Dies ist das Standard-Datums- / Uhrzeitformat 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 Timestring hat ein Format, das folgendermaßen aussieht:

'02-24-2015 09:22:21 PM'

Hier können Sie den folgenden regulären Ausdruck ausführen:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

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

Option 3:

Angenommen, Sie haben eine Zeitzeichenfolge, die sich nicht einfach an einen der gut unterstützten Standards anpassen lässt.

In diesem Fall ist es am besten, Ihre Zeitzeichenfolge in verschiedene Teile aufzuteilen und sie als individuelle Parameter zu verwenden für Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE

John Slegers
quelle
var d = neues Datum ('2017-08-28 08:02 PM'.replace (/ - / g,' / ')); Dies funktioniert perfekt für mich in Chrom sowie in Mozilla.
Rahul Mankar
8

Wenn Sie weiterhin ein Datum mit Bindestrichen erstellen möchten, können Sie dieses Format verwenden:

var date = new Date('2013-08-31T17:00:00Z')

Aber denken Sie daran, dass es laut UTC Zeit schafft. Das heißt, wenn Sie in der Zeitzone GMT + 3 (3 Stunden vor GMT) leben, wird dieser Zeitzonenversatz zur Zeit 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 andernfalls unterschiedlich analysieren (einer fügt den Zeitversatz hinzu und der andere nicht).

Gabrielius
quelle
1
Ja, Chrom und Firefox verhalten sich unterschiedlich, wenn Sie keine Zeitzone angeben. Und aus Interesse denke ich, dass Firefox es falsch macht. Es sollte GMT angenommen werden, wenn keine Zeitzone vorhanden ist. Chrome tut es, Firefox nicht. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs
@ JulianJelfs - " Es sollte GMT annehmen, wenn keine Zeitzone vorhanden ist ", nur für das Datum (im Gegensatz zu ISO 8601). Für Datums- und Zeitzeichenfolgen sollte lokal angenommen werden (gemäß ISO 8601). In jedem Fall ist das manuelle Parsen der einzig sichere Weg.
RobG
5

Bei der Arbeit mit AngularJS hatte ich sowohl in Firefox als auch in Safari ein ähnliches Problem. Wenn beispielsweise ein von Angular zurückgegebenes Datum folgendermaßen aussieht:

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 beim Parsen von Datumszeichenfolgen höchstwahrscheinlich nur flexibler.

Mein letztendliches Ziel war es, das Datum auf eine bestimmte Weise zu formatieren. Ich habe eine ausgezeichnete Bibliothek gefunden, die sowohl das Problem der Cross-Browser-Kompatibilität als auch das Problem der Datumsformatierung behandelt. Die Bibliothek heißt moment.js .

Mit dieser Bibliothek funktioniert der folgende Code in allen von mir getesteten Browsern ordnungsgemäß:

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 mögliche Probleme mit der Browserkompatibilität vermeiden. Als Bonus haben Sie eine gute Möglichkeit, Daten bei Bedarf einfach zu formatieren, hinzuzufügen, zu subtrahieren usw.

Schnappschuss
quelle
Sie sollten immer das Format zu übergeben moment.js wenn Strings Parsen, sonst ist es nur Vermutungen , bis er einen findet, der ein gültiges Datum erstellt.
RobG
4

Dies sollte für Sie funktionieren:

var date1 = new Date(year, month, day, hour, minute, seconds);

Ich musste ein 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 zwischen 0 und 11 liegen. Daher 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));
Bartek Kosa
quelle
2

Einfache Lösung, Dies funktioniert mit allen Browsern,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);
XORG_99
quelle
1

Eine Situation, in die ich geraten bin, war der Umgang mit Millisekunden. FF und IE analysieren diese Datumszeichenfolge nicht korrekt, wenn versucht wird, ein neues Datum zu erstellen. "2014/11/24 17:38:20.177Z" Sie wissen nicht, wie sie damit umgehen sollen .177Z. Chrome wird jedoch funktionieren.

bjo
quelle
0

In der Tat ist Chrome flexibler, um mit unterschiedlichen Zeichenfolgenformaten umzugehen. Auch wenn Sie das String-Format nicht kennen, kann Chrome String ohne Fehler erfolgreich in Datum konvertieren. So was:

  var outputDate = new Date(Date.parse(inputString));

Aber für Firefox und Safari werden die Dinge komplexer. In Firefox 'Dokument heißt es bereits: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

Eine Zeichenfolge, die ein RFC2822- oder ISO 8601-Datum darstellt (andere Formate können verwendet werden, die Ergebnisse können jedoch unerwartet sein).

Wenn Sie Date.parse in Firefox und Safari verwenden möchten , sollten Sie vorsichtig sein. Für mich benutze ich eine Trickmethode, um damit umzugehen. (Hinweis: Es ist möglicherweise nicht immer in allen Fällen korrekt.)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

Hier wird zuerst 2013-08-08 11:52:18 UTC in 2013-08-08T11: 52: 18Z konvertiert , und dann werden die Wörter in Firefox 'Dokument angepasst . Zu diesem Zeitpunkt ist Date.parse in jedem Browser immer richtig.

Haimei
quelle
0

Das hat bei mir funktioniert Firefoxund Chrome:

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

Viel Glück...

Akash
quelle
-1

In Firefox wird jedes ungültige Datum als Datumsobjekt als Datum zurückgegeben 1899-11-29T19:00:00.000Z. Überprüfen Sie daher, ob der Browser Firefox ist, und rufen Sie das Datumsobjekt der Zeichenfolge ab "1899-11-29T19:00:00.000Z".getDate(). Vergleichen Sie es schließlich mit dem Datum.

Shahrukh Azeem
quelle
Dies erklärt nicht die Ursache des Problems, sondern das Ergebnis des Problems.
Rytis
-1

Ich habe das folgende Datumsformat verwendet und es funktioniert in allen Browsern.

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
umesh
quelle