2010-07-14 4 views
18

У меня есть фид Twitter и я создаю новую дату obj, поэтому я могу отформатировать дату по своему вкусу.Проблема с функцией Javascript Date в IE 7, возвращает NaN

var created = new Date(this.created_at) работает в firefox и chrome, но не в IE7. Кажется, у меня проблемы с передачей даты через функцию new Date(). Он просто возвращает undefined и 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> 

ответ

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")); 
    } 
}); 
+0

спасибо. Это отлично работает. Я все еще учусь. Поэтому, если я правильно понимаю. Вы создали новую функцию, называемую parseDate, и передали ей строку даты и создали новый массив, разделив ее везде, где было место. Затем вы реорганизовали его в соответствующем формате. Кроме того, я новичок на этом сайте. Итак, что мне нужно сделать, чтобы дать вам очки? – superwhatever

+0

Да, это именно оно. Также важно добавить «UTC» или «GMT» в конце; без этого js будет считать, что это время в локальном часовом поясе пользователя (это, конечно же, не означает, что сервер twitter не обязательно знает, в какой временной зоне находится пользователь). Вы можете щелкнуть треугольник над «0» рядом с моим ответом на +1 меня, но я думаю, вам нужно создать учетную запись, чтобы сделать это. :) –

+0

Как вы называете этот формат? (Вт Июл 13 23:18:36 +0000 2010) – brad

3

Я нашел, что синтаксический анализ даты jQuery Globalization Plugin работает лучше всего. Другие методы имели проблемы с перекрестным браузером, и такие вещи, как date.js, не обновлялись довольно долго.

Вам также не нужен datePicker на странице. Вы можете просто называть что-то похожее на пример, приведенный в документах:

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

Это отлично подходит для дат, но не время разбора. – 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(); 
} 

И это дает мне «19:38 PM 23 апреля 2012» в Chrome, IE и Firefox.

Смежные вопросы