2010-07-14 15 views
18

Tengo un feed de Twitter y creo una nueva fecha obj para que pueda formatear la fecha a mi gusto.Problema con la función de fecha de Javascript en IE 7, devuelve NaN

var created = new Date(this.created_at) funciona en firefox y Chrome, pero no en IE7. Parece que tengo problemas para pasar la fecha a través de la función new Date(). Simplemente devuelve indefinido y NaN.

Aquí está el código. Si intentas probarlo, no olvides incluir jquery. Gracias.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Twitter Test</title> 
<script type="text/javascript" src="jquery-1.4.2.js"></script> 
<script type="text/javascript" > 

$(function(){ 
$.getJSON("http://twitter.com/statuses/user_timeline/google.json?count=1&callback=?", function(data){ 
    $.each(data, function(){ 
     var created = new Date(this.created_at) 
     $("<div></div>").append("<ul><li>Unformatted: " + this.created_at + "</li><li>Formatted: " + created + "</li></ul>").appendTo("body") 
    }); 

}) 

}) 

</script> 
</head> 

<body> 
</body> 
</html> 

Respuesta

17

Usted querrá asegurarse de que la fecha se analiza como UTC, porque de lo contrario Javascript a lo interpretará como una fecha en su zona horaria local.

La fecha tiene el siguiente aspecto: Tue Jul 13 23:18:36 +0000 2010

puede analizar de esta manera:

function parseDate(str) { 
    var v=str.split(' '); 
    return new Date(Date.parse(v[1]+" "+v[2]+", "+v[5]+" "+v[3]+" UTC")); 
} 

que dará a la fecha/hora correcta en la zona horaria local, por ejemplo: Tue Jul 13 2010 19:18:36 GMT-0400 (EDT)

Así que eso debería dejar su código buscando algo como esto:

$(function(){ 
    $.getJSON("http://twitter.com/statuses/user_timeline/google.json?count=1&callback=?", function(data){ 
    $.each(data, function(){ 
     var created = parseDate(this.created_at); 
     $("<div></div>").append("<ul><li>Unformatted: " + this.created_at + "</li><li>Formatted: " + created + "</li></ul>").appendTo("body"); 
    }); 
    }); 
    function parseDate(str) { 
    var v=str.split(' '); 
    return new Date(Date.parse(v[1]+" "+v[2]+", "+v[5]+" "+v[3]+" UTC")); 
    } 
}); 
+0

Gracias. Esto funciona genial Todavía estoy aprendiendo. Entonces si entiendo bien. Creó una nueva función llamada parseDate y le pasó la cadena de fecha y creó una nueva matriz dividiéndola donde haya espacio. Luego lo reorganizaste en el formato apropiado. Además, soy nuevo en este sitio. Entonces, ¿qué tengo que hacer para darte puntos de representante? – superwhatever

+0

Sí, eso es exactamente. También es importante agregar 'UTC' o 'GMT' al final; sin que js asuma que es un momento en la zona horaria local del usuario (no es, por supuesto, el servidor de Twitter no necesariamente sabe en qué zona horaria se encuentra el usuario). Puede hacer clic en el triángulo que está encima del '0 'al lado de mi respuesta para hacer +1, pero creo que debe haber creado una cuenta para hacerlo. :) –

+0

¿Cómo se llama este formato? (Mar 13 jul. 23:18:36 +0000 2010) – brad

3

He encontrado el análisis de fecha jQuery Globalization Plugin para que funcione mejor. Otros métodos tenían problemas entre navegadores y cosas como date.js no se habían actualizado en bastante tiempo.

Tampoco necesita un datePicker en la página. Simplemente puede llamar a algo similar al ejemplo dado en los documentos:

$.parseDate('yy-mm-dd', '2007-01-26'); 
+0

Esto funciona bien para las fechas, pero no analiza los tiempos. – TelegramSam

1

¡Esto es lo que hice para corregir esto!

$tweetList.append('<p><span class="twitterdate">' + parseTwitterDate(item.created_at) + location + '</span></p>'); 

var month=new Array(); 
month[0]="January"; 
month[1]="February"; 
month[2]="March"; 
month[3]="April"; 
month[4]="May"; 
month[5]="June"; 
month[6]="July"; 
month[7]="August"; 
month[8]="September"; 
month[9]="October"; 
month[10]="November"; 
month[11]="December"; 

function parseTwitterDate($stamp) { 
    var v=$stamp.split(' '); 
    var date = new Date(Date.parse(v[1]+" "+v[2]+", "+v[5]+" "+v[3]+" UTC")); 
    var hour = date.getHours(); 
    var ampm = hour<12 ? ' AM' : ' PM'; 
    return date.getHours() +':'+ date.getMinutes() +' '+ ampm +' '+ date.getDate() +' '+ month[date.getMonth()] +' '+ date.getFullYear(); 
} 

Y esto me da "19:38 PM 23 de abril de 2012" en Chrome, IE y Firefox.

Cuestiones relacionadas