IE 7中Javascript Date函数存在问题,返回NaN。

18

我有一个Twitter动态,我创建了一个新的日期对象,以便按我的喜好格式化日期。

var created = new Date(this.created_at) 在Firefox和Chrome中可以工作,但在IE7中不行。我似乎无法通过new Date()函数传递日期。它只返回未定义和NaN。

这是代码。如果您要尝试测试,请不要忘记包含jQuery。谢谢。

<!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>
3个回答

17

你需要确保日期被解析为UTC时间,否则JavaScript会将其解释为本地时区的日期。

日期看起来像这样:Tue Jul 13 23:18:36 +0000 2010

你可以这样解析它:

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

以下代码将会以本地时区输出正确的日期/时间,例如:Tue Jul 13 2010 19:18:36 GMT-0400 (EDT)

因此,你的代码应该类似于以下内容:

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

谢谢。这个很好用。我还在学习中。所以如果我理解正确的话,您创建了一个名为parseDate的新函数,并将日期字符串传递给它,通过在空格处拆分它来创建一个新数组。然后您按适当的格式重新组织了它。另外,我是这个网站的新手。那么我该怎么做才能给您点赞呢? - superwhatever
没错,就是这样。在末尾添加“UTC”或“GMT”非常重要;如果没有这个,js会认为它是用户本地时区的时间(当然不是;Twitter的服务器不一定知道用户在哪个时区)。你可以点击我的答案旁边“0”上面的三角形来给我点赞,但我认为你需要先创建一个账户才能这么做。 :) - Dagg Nabbit
你如何称呼这种格式?(2010年7月13日星期二23:18:36 +0000) - brad
@brad - 就我所知,没有任何标准格式,年份在时区之后;如果我有错,请有人纠正我。 - Dagg Nabbit
我并不这样认为,但我想至少尝试一下找出答案。Twitter使用如此非标准的格式有点奇怪。感谢您的帮助。 - brad
谢谢你的解析器。我太懒了,自己修复起来很麻烦,这个解析器非常稳定! - Justus Romijn

3
我发现jQuery全球化插件的日期解析效果最好。其他方法存在跨浏览器问题,而像date.js这样的方法已经有一段时间没有更新了。
您也不需要在页面上使用一个日期选择器。您可以调用类似于文档中给出的示例的内容:
$.parseDate('yy-mm-dd', '2007-01-26');

这对于日期非常好用,但不适用于解析时间。 - TelegramSam

1

这是我为了纠正这个问题所做的!

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

这使我在 Chrome、IE 和 Firefox 上获得了 "2012年4月23日 下午7:38"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接