2012-11-13 6 views
28

Sto lavorando a un'app per iOS basata su PhoneGap, che è già stata eseguita per Android. Le seguenti linee funzionano bene per Android ma non per iOS. Perché?La data JavaScript non è valida su iOS

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

Risultato per Android:

31.11 2015 

Risultato su iOS:

NaN. NaN NaN 

casi in cui è la differenza proviene?

risposta

65

La stringa della data non è in un formato specificato per funzionare con new Date. L'unico formato nelle specifiche è a simplified version of ISO-8601, ma è stato aggiunto solo in ES5 e quindi il supporto potrebbe essere touch and go. La tua stringa non è in quel formato, ma è molto vicina.

Se si modifica lo spazio per un T, sarete in specifiche:

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

(sto supponendo che non sta usando una stringa letterale, da qui la chiamata replace.)

Si noti che c'era un errore nella specifica ES5 che è stato corretto in ES2015 (ES6): Cosa accade quando non c'è un indicatore del fuso orario sulla stringa. In ISO-8601, nessun indicatore indica "ora locale", ma la specifica ES5 ha dichiarato che il valore predefinito è Z (GMT). Lo hanno risolto nelle specifiche ES2015, ma sfortunatamente alcuni motori JavaScript hanno seguito le specifiche ES5 e altri hanno seguito ISO-8601 (e ora ES2015), quindi per un solido supporto cross-browser, devi includere un indicatore del fuso orario perché altrimenti non sapere se sarà interpretato come GMT o ora locale. È consentito utilizzare Z per GMT o +/- seguito da HH:MM per ottenere un offset. (Le abbreviazioni come CST non sono consentite, poiché non esiste uno standard per esse.)

Se non lo supportano ancora, anche se non è documentato, è disponibile il supporto universale per YYYY/MM/DD HH:MM:SS. Quindi:

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

Cheers, il T sta facendo il trucco ! –

+1

@PhilippSiegfried: eccellente, felice che abbia aiutato! –

+1

@NULL: non ho mai visto un motore JavaScript che non lo supporta.IE6 e versioni successive, ogni versione di Firefox che abbia mai visto, ogni versione di Chrome, ogni versione di Opera. ** Ma **, si deve sempre testare su quegli ambienti target (se qualcosa è "standard" o no, purtroppo). –

5

Non posso dirvi perché. Forse perché iOS non supporta la funzione Date Javascript così come Android o supporta un formato diverso?

Ma posso darvi una soluzione alternativa:

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

cercherò e tornare a voi – samouray

1

Prova con var d = new Date("2015/12/31 00:00:00"); funziona per me.

-1

anche

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

lavori per me :)

Grazie @dda

+0

Non funziona per me senza sostituire lo spazio con una 'T' – zanderwar

Problemi correlati