hora - fechas en javascript
El análisis de la fecha JSON de Javascript en IE7/IE8 devuelve NaN (5)
Estoy analizando una fecha de un feed de eventos JSON, pero la fecha muestra "NaN" en IE7 / 8:
// Variable from JSON feed (using JQuery''s $.getJSON)
var start_time = ''2012-06-24T17:00:00-07:00'';
// How I''m currently extracting the Month & Day
var d = new Date(start_time);
var month = d.getMonth();
var day = d.getDate();
document.write(month+''/''+day);// "6/24" in most browsers, "Nan/Nan" in IE7/8
¿Qué estoy haciendo mal? ¡Gracias!
@gib Gracias por la sugerencia en Moment.js. Esta pequeña biblioteca realmente ayuda con el manejo de fechas y JavaScript.
Moment.js resolvió el problema descrito en la pregunta original que yo también tenía. IE8 estaba visualizando fechas JSON ISO como NaN cuando se analizó en un nuevo objeto Date ().
Solución rápida (incluya moment.js en su página, o copie el código en sus funciones js)
Si solo necesita mostrar una fecha en su página, cargada desde una fecha ISO JSON, haga esto:
order_date = moment(data.OrderDate); //create a "moment" variable, from the "data" object in your JSON function in Protoype or jQuery, etc.
$(''#divOrderDate).html(order_date.calendar()); //use Moment''s relative date function to display "today", "yesterday", etc.
o
order_date = moment(data.OrderDate); //create a "moment" variable, from the "data" object in your JSON function in Protoype or jQuery, etc.
$(''#divOrderDate).html(order_date.format(''m/d/YYYY'')); //use Moment''s format function to display "2/6/2015" or "10/19/2014", etc.
Si debe tener un objeto Date () (digamos para usar con los componentes de jQuery), haga lo siguiente para completar con éxito su fecha ISO proporcionada por JSON. (Esto supone que ya está dentro de la función de manejar sus datos JSON).
var ship_date = new Date(moment(data.ShipDate).format(''m/d/YYYY'')); //This will successfully parse the ISO date into JavaScript''s Date() object working perfectly in FF, Chrome, and IE8.
//initialize your Calendar component with the "ship_date" variable, and you won''t see NaN again.
En los navegadores más antiguos, puede escribir una función que analizará la cadena por usted.
Éste crea un método Date.fromISO: si el navegador puede obtener de forma nativa la fecha correcta a partir de una cadena ISO, se utiliza el método nativo.
Algunos navegadores lo tienen en parte correcto, pero devolvieron la zona horaria incorrecta, por lo que simplemente no vale la pena buscar NaN.
Polyfill:
(function(){
var D= new Date(''2011-06-02T09:34:29+02:00'');
if(!D || +D!== 1307000069000){
Date.fromISO= function(s){
var day, tz,
rx=/^(/d{4}/-/d/d/-/d/d([tT ][/d:/.]*)?)([zZ]|([+/-])(/d/d):(/d/d))?$/,
p= rx.exec(s) || [];
if(p[1]){
day= p[1].split(//D/);
for(var i= 0, L= day.length; i<L; i++){
day[i]= parseInt(day[i], 10) || 0;
};
day[1]-= 1;
day= new Date(Date.UTC.apply(Date, day));
if(!day.getDate()) return NaN;
if(p[5]){
tz= (parseInt(p[5], 10)*60);
if(p[6]) tz+= parseInt(p[6], 10);
if(p[4]== ''+'') tz*= -1;
if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
}
return day;
}
return NaN;
}
}
else{
Date.fromISO= function(s){
return new Date(s);
}
}
})()
Resultado:
var start_time = ''2012-06-24T17:00:00-07:00'';
var d = Date.fromISO(start_time);
var month = d.getMonth();
var day = d.getDate();
alert(++month+'' ''+day); // returns months from 1-12
Para ie7 / 8 simplemente lo hice:
var ds = yourdatestring;
ds = ds.replace(/-/g, ''/'');
ds = ds.replace(''T'', '' '');
ds = ds.replace(/(/+[0-9]{2})(/:)([0-9]{2}$)/, '' UTC/$1/$3'');
date = new Date(ds);
Esto reemplaza todas las apariciones de "-" con "/", marca de tiempo "T" con un espacio y reemplaza la información de zona horaria con una cadena amigable para IE que permite que IE7 / 8 analice las fechas de las cadenas correctamente. Resolvió todos los problemas para mí.
Sugiero http://momentjs.com/ para ver los problemas de fechas del navegador cruzado.
Ver la publicación de RobG en Result of toJSON () en una fecha diferente entre IE8 e IE9 + .
Debajo de la función funcionó para mí en IE 8 y abajo.
// parse ISO format date like 2013-05-06T22:00:00.000Z
function convertDateFromISO(s) {
s = s.split(//D/);
return new Date(Date.UTC(s[0], --s[1]||'''', s[2]||'''', s[3]||'''', s[4]||'''', s[5]||'''', s[6]||''''))
}
Puedes probar como a continuación:
var currentTime = new Date(convertDateFromISO(''2013-05-06T22:00:00.000Z'')).getTime();
alert(currentTime);