Análise JavaScript JSON Date no IE7 / IE8 retorna NaN

Estou analisando uma data de um feed de evento JSON, mas a data mostra “NaN” no 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 

O que estou fazendo de errado? Obrigado!

Em navegadores mais antigos, você pode escrever uma function que analisará a string para você.

Este cria um método Date.fromISO – se o navegador puder obter a data correta de uma string ISO, o método nativo será usado.

Alguns navegadores o acertaram parcialmente, mas retornaram o fuso horário errado, portanto, apenas verificar o NaN pode não funcionar.

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 

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 eu acabei de fazer:

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

Isso substitui todas as ocorrências de “-” por “/”, o marcador de tempo “T” por um espaço e substitui as informações de fuso horário por uma string amigável ao IE, que permite ao IE7 / 8 analisar as Datas de Strings corretamente. Resolvi todos os problemas para mim.

Veja o post de RobG em Result of toJSON () em uma data diferente entre IE8 e IE9 + .

Abaixo function funcionou para mim no IE 8 e abaixo.

 // 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]||'')) } 

Você pode testar como abaixo:

 var currentTime = new Date(convertDateFromISO('2013-05-06T22:00:00.000Z')).getTime(); alert(currentTime); 

Sugiro http://momentjs.com/ para problemas de data entre navegadores.

@gib Obrigado pela sugestão em Moment.js. Esta pequena biblioteca realmente ajuda a lidar com datas e JavaScript.

Moment.js resolveu o problema descrito na pergunta original que eu também estava tendo. O IE8 exibia datas JSON ISO como NaN quando analisado em um novo object Date ().

Solução rápida (inclua moment.js na sua página ou copie o código para as funções js)

Se você só precisar exibir uma data na sua página, carregada de uma data ISO do JSON, faça o seguinte:

 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. 

ou

 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. 

Se você deve ter um object Date () (digamos, para uso com componentes jQuery), faça o seguinte para preencher com êxito sua data ISO fornecida pelo JSON. (Isso pressupõe que você já esteja dentro da function de manipular seus dados 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.