2012-11-13 7 views
28

Ich arbeite an einer Phonegap-basierten iOS-App, die bereits für Android getan wird. Die folgenden Zeilen funktionieren gut für Android, aber nicht für iOS. Warum?Javascript Datum ist ungültig auf iOS

var d = new Date("2015-12-31 00:00:00"); 
console.log(d.getDate() + '. ' + d.getMonth() + ' ' + d.getFullYear(); 

Ergebnis für Android:

31.11 2015 

Ergebnis auf iOS:

NaN. NaN NaN 

Wo ist der Unterschied zu kommen?

Antwort

65

Ihre Datumszeichenfolge ist nicht in einem Format, das mit new Date arbeiten soll. Das einzige Format in der Spezifikation ist a simplified version of ISO-8601, aber das wurde nur in ES5 hinzugefügt und so kann Unterstützung Touch sein und gehen. Deine Zeichenfolge ist nicht in diesem Format, aber sie ist sehr nah.

Wenn Sie den Platz zu einem T ändern, werden Sie in spec sein:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(' ', 'T')); 

(ich nehme an, Sie sind nicht wirklich eine Stringliteral verwenden, damit die replace Anruf.)

Beachten Sie, dass in der ES5-Spezifikation ein Fehler aufgetreten ist, der in ES2015 (ES6) korrigiert wurde: Was passiert, wenn auf der Zeichenfolge kein Zeitzonenindikator angezeigt wird? In ISO-8601 bedeutet kein Indikator "lokale Zeit", aber die ES5-Spezifikation besagt, dass standardmäßig Z (GMT) angegeben wird. Sie haben es in der ES2015-Spezifikation behoben, aber leider folgten einige JavaScript-Engines der ES5-Spezifikation und andere folgten ISO-8601 (und jetzt ES2015). Daher müssen Sie für eine solide browserübergreifende Unterstützung einen Zeitzonenindikator angeben, da Sie dies sonst nicht tun wissen, ob es als GMT oder Ortszeit interpretiert wird. Sie dürfen Z für GMT oder +/- verwenden, gefolgt von HH:MM, um einen Offset zu erhalten. (Abkürzungen wie CST sind nicht erlaubt, da es für sie keinen Standard gibt.)

Wenn sie das noch nicht unterstützen, obwohl es nicht dokumentiert ist, gibt es fast universelle Unterstützung für YYYY/MM/DD HH:MM:SS. Also:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(/-/g, '/')); 
+0

Cheers, ist die T den Trick tun ! –

+1

@PhilippSiegfried: Ausgezeichnet, froh, dass geholfen hat! –

+1

@NULL: Ich habe noch nie eine JavaScript-Engine gesehen, die das nicht unterstützt.IE6 und höher, jede Version von Firefox, die ich je gesehen habe, jede Version von Chrome, jede Version von Opera. ** Aber **, man muss immer an seinen Zielumgebungen testen (ob etwas "Standard" ist oder nicht, leider). –

5

Ich kann dir nicht sagen, warum. Vielleicht, weil iOS die Funktion "Javascript Date" nicht unterstützt und kein anderes Format unterstützt?

Aber ich kann Ihnen eine Abhilfe geben:

var s = "2015-12-31 00:00:00".split(" ")[0].split("-"), 
    d = new Date(s[0], s[1], s[2], 0, 0, 0); 

console.log(d); 

var s = "2015-12-31 00:00:00".replace(/[ :]/g, "-").split("-"), 
    d = new Date(s[0], s[1], s[2], s[3], s[4], s[5]); 

console.log(d); 
+0

ich es versuchen und sich wieder auf Sie – samouray

1

mit var d = new Date("2015/12/31 00:00:00"); Works Versuchen Sie, für mich.

-1

Auch

var d = new Date("2015/12/31 00:00:00"); 

Werke für mich :)

Dank @dda

+0

Funktioniert bei mir nicht, ohne den Platz durch ein 'T' zu ersetzen – zanderwar

Verwandte Themen