2012-06-28 13 views
9

Sto prendendo una data da un oggetto JSON nel formato 2012-12-31 e sto provando a convertirla in valori amichevoli e a produrla.javascript data object issue in Safari e IE

var redeemableDate = item.Deal.RedeemableDate; //this is coming in the form of 2012-12-31 
    var redeemableDate = new Date(redeemableDate); 
    var rdDay = weekday[redeemableDate.getDay()]; //using an array with weekdays 
    var rdDate = redeemableDate.getDate(); 
    var rdMonth = monthNames[redeemableDate.getMonth()]; //using an array with month names 
    var rdYear = redeemableDate.getFullYear(); 

    response.write('Valid ' + rdDay + ' ' + rdDate + ' ' + rdMonth + ' ' + rdYear + ' ONLY'); 

E tutte le opere trovano e dandy in Firefox e Chrome, ma Safari e IE (testato solo su IE8 finora) non piace.

in FF e Chrome ottengo l'atteso:

Valido Domenica 2 settembre 2012 SOLO

Ma in Safari e IE, ottengo:

valido undefined NaN undefined SOLO NaN

Quando avviso rosso eemableDate dopo averlo impostato come oggetto Date, Safari restituisce 'Invalid Date' e IE restituisce 'NaN'. Questo è ovviamente il problema. C'è un modo per ottenere il mio valore in un oggetto data per questi browser?

risposta

24

Il formato della data aaa-mm-gg (ISO 8601) non è supportato in Safari e IE. Fa parte di ECMAscript 5, quindi dovrebbe essere solo una questione di tempo.

Una soluzione sarebbe quella di passare la data come argomenti alla data.

var date = "2012-12-31".split("-"); 
var your_date = new Date(date[0], date[1]-1, date[2]); 

Nota che il parametro mese inizia a zero (per gennaio), quindi è necessario sottrarre 1 dal valore ottenuto dalla stringa.

MODIFICA: Per una scorciatoia vedere la risposta di joe larson di seguito.

+0

soluzione semplice e dolce :) –

+10

'var your_date = new Data (dateString.split (" - "). Join ("/"));' – jlarson

+0

Buono uno Joe! Aggiornerò la mia risposta – jack

6

è meglio parsing della stringa data di te stesso:

function dateFromISO(str) { 
    var d = null; 
    str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, y, m, d) { 
    d = new Date(parseInt(y, 10), parseInt(m, 10) - 1, parseInt(d, 10)); 
    }); 
    return d; 
} 

redeemableDate = dateFromISO(redeemableDate); 

Anche se gli altri browser è piaciuto quelle stringhe di data, si avrebbe il problema di loro sempre essere interpretate come UTC. Per esempio, per esempio, quando passo quella stringa "2012-12-31" a Firefox, mi dice che la data è il 30 dicembre 2012, perché sono 6 ore indietro rispetto a UTC. In altre parole, "2012-12-31" viene interpretato come mezzanotte di tale data, ora UTC. Supponendo che tu voglia che tutti nel mondo vedano la data giusta, se costruisci l'oggetto Date con numeri si presume che sia l'ora locale sul client.

1

Le versioni precedenti di Internet Explorer (e apparentemente la versione di Safari) non analizzeranno una stringa aaaa-mm-gg, ad esempio new Date('2012-12-31').

Un'altra opzione è jQuery.datepicker.parseDate(), anche se potrebbe essere un po 'eccessivo.

-1

In caso di utilizzo di un servizio Web PHP, si consiglia di restituire le date utilizzando $row['date'] = date('j/n/Y',strtotime($row['date'])); per avere funzionalità normale con Safari/vale a dire.

2

combinazione di jack e risposta Joe Larson, il seguente codice ha funzionato bene per me:

 $scope.formatDate = function(date){ 
       var date = date.split("-").join("/"); 
       var dateOut = new Date(date); 
       return dateOut; 
     }; 

funziona bene per Chrome e Safari ...:)
Grazie Jack e joe larson !!!

Problemi correlati