2010-07-14 1 views
18

J'ai un flux Twitter et je crée une nouvelle date obj afin que je puisse mettre en forme la date à mon goût.Problème avec la fonction de date Javascript dans IE 7, renvoie NaN

var created = new Date(this.created_at) fonctionne dans firefox et chrome mais pas dans IE7. Je semble avoir du mal à passer la date à travers la fonction new Date(). Il renvoie juste undefined et NaN.

Voici le code. Si vous essayez de le tester, n'oubliez pas d'inclure jquery. Je vous remercie.

<!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> 

Répondre

17

Vous voulez vous assurer que la date est analysée comme UTC, parce que sinon javascript interprétera comme une date dans votre fuseau horaire local.

La date ressemble à ceci: Tue Jul 13 23:18:36 +0000 2010

Vous pouvez l'analyser comme ceci:

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

Ce qui vous donnera la date/heure dans le fuseau horaire local, par exemple: Tue Jul 13 2010 19:18:36 GMT-0400 (EDT)

Cela devrait laisser votre code ressemblant à ceci:

$(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

Merci. Cela fonctionne très bien. Je continue d'apprendre. Donc si je comprends bien. Vous avez créé une nouvelle fonction appelée parseDate et transmis la chaîne de date et créé un nouveau tableau en le divisant partout où il y avait un espace. Ensuite, vous l'avez réorganisé dans le format approprié. Aussi, je suis nouveau sur ce site. Alors, que dois-je faire pour vous donner des points de rep? – superwhatever

+0

Oui, c'est exactement ça. Il est également important d'ajouter «UTC» ou «GMT» à la fin. sans cela, je suppose que c'est un moment dans le fuseau horaire local de l'utilisateur (ce n'est pas, bien sûr, le serveur de Twitter ne sait pas nécessairement dans quel fuseau il se trouve). Vous pouvez cliquer sur le triangle au-dessus du '0' à côté de ma réponse pour me donner +1, mais je pense que vous devez avoir créé un compte pour le faire. :) –

+0

Comment appelez-vous ce format? (Mar Jul 13 23:18:36 +0000 2010) – brad

3

J'ai trouvé l'analyse de date jQuery Globalization Plugin pour fonctionner au mieux. D'autres méthodes ont eu des problèmes de navigateur et des choses comme date.js n'avaient pas été mises à jour depuis longtemps.

Vous n'avez pas non plus besoin de datePicker sur la page. Vous pouvez simplement appeler quelque chose de similaire à l'exemple donné dans les docs:

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

Cela fait grand pour les dates, mais ne pas analyser les temps. – TelegramSam

1

Voici ce que j'ai fait pour corriger cela!

$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(); 
} 

Et cela me donne "19:38 PM 23 avril 2012" sur Chrome, IE et Firefox.