2012-06-28 18 views
9

Estoy sacando una fecha de un objeto JSON en el formato de 2012-12-31 e intentando convertirlo en valores amigos y emitirlo.javascript date issue issue in Safari and 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'); 

Se encuentran todas las obras y dandy en Firefox y Chrome, pero Safari e IE (sólo probado en IE8 hasta ahora) no les gusta.

En FF y Chrome tengo la espera:

Válido Domingo 2 de septiembre de 2012 Solamente

Pero en Safari e IE, me sale:

Válido indefinido NaN indefinido NaN SOLAMENTE

Cuando alerta rojo eemableDate después de haberlo configurado como un objeto Date, Safari devuelve 'Fecha no válida' e IE devuelve 'NaN'. Esto es obviamente donde radica el problema. ¿Hay alguna manera de que pueda obtener mi valor en un objeto de fecha para estos navegadores?

Respuesta

24

El formato de fecha aaa-mm-dd (ISO 8601) no es compatible con Safari e IE. Sin embargo, es parte de ECMAscript 5, por lo que debería ser solo una cuestión de tiempo.

Una solución sería pasar la fecha como argumentos para Fecha.

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

Tenga en cuenta que el parámetro mes comienza en cero (de enero), por lo que debe restar 1 al valor obtenido de la cadena.

EDITAR: Para un atajo, vea la respuesta de joe larson a continuación.

+0

solución simple y dulce :) –

+10

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

+0

¡Buen Joe! Actualizaré mi respuesta. – jack

6

Es mejor que analizar la cadena de fecha a sí mismo:

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); 

Incluso si los otros navegadores le gusta esas cadenas de fecha, tendría el problema de ellos siempre que puedan entenderse UTC. Para mí, por ejemplo, cuando paso esa cadena "2012-12-31" a Firefox, me dice que la fecha es el 30 de diciembre de 2012, porque estoy a 6 horas de UTC. En otras palabras, "2012-12-31" se interpreta como la medianoche de esa fecha, hora UTC. Suponiendo que desea que todos en el mundo vean la fecha correcta, si construye el objeto Date con números, se supone que es la hora local en el cliente.

1

Las versiones anteriores de Internet Explorer (y aparentemente su versión de Safari) no analizarán una cadena aaa-mm-dd, como new Date('2012-12-31').

Otra opción es jQuery.datepicker.parseDate(), aunque puede ser un poco exagerado.

-1

En el caso de utilizar un servicio web PHP, recomendaría devolver las fechas usando $row['date'] = date('j/n/Y',strtotime($row['date'])); para tener una funcionalidad normal con safari/ie.

2

Combinando tomas y la respuesta de Joe Larson, el siguiente código funcionado bien para mí:

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

funciona bien para Chrome y Safari ...:)
Gracias Jack y Joe Larson !!!