2010-07-14 32 views
18

Tôi có một nguồn cấp dữ liệu twitter và tôi tạo một ngày tháng mới để tôi có thể định dạng ngày theo ý thích của mình.Vấn đề với chức năng Javascript ngày trong IE 7, trả về NaN

var created = new Date(this.created_at) hoạt động trong firefox và chrome nhưng không hoạt động trong IE7. Dường như tôi gặp sự cố khi chuyển ngày qua chức năng new Date(). Nó chỉ trả về undefined và NaN.

Đây là mã. Nếu bạn cố gắng kiểm tra nó ra đừng quên bao gồm jquery. Cảm ơn bạn.

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

Trả lời

17

Bạn sẽ muốn đảm bảo ngày được phân tích cú pháp là UTC, bởi vì javascript khác sẽ diễn giải ngày đó theo múi giờ địa phương của bạn.

Ngày trông như thế này: Tue Jul 13 23:18:36 +0000 2010

Bạn có thể phân tích nó như thế này:

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

Mà sẽ cung cấp đúng ngày/thời gian trong múi giờ địa phương, ví dụ: Tue Jul 13 2010 19:18:36 GMT-0400 (EDT)

Vì vậy, nên để mã của bạn trông giống như thế này:

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

Cảm ơn bạn. Điều này làm việc tuyệt vời. Tôi vẫn đang học. Vì vậy, nếu tôi hiểu đúng. Bạn đã tạo ra một hàm mới có tên là parseDate và thông qua chuỗi ngày tháng đó và tạo một mảng mới bằng cách chia nó ra bất cứ nơi nào có một không gian. Sau đó, bạn tổ chức lại nó theo định dạng thích hợp. Ngoài ra, tôi mới sử dụng trang web này. Vì vậy, tôi phải làm gì để cung cấp cho bạn điểm đại diện? – superwhatever

+0

Vâng, đúng vậy. Ngoài ra thêm 'UTC' hoặc 'GMT' ở cuối là quan trọng; mà không có js đó sẽ giả định đó là một thời gian trong múi giờ địa phương của người dùng (nó không phải, tất nhiên; máy chủ của twitter không nhất thiết phải biết múi giờ người dùng đang ở trong đó). Bạn có thể nhấp vào hình tam giác phía trên '0' bên cạnh câu trả lời của tôi để +1 cho tôi, nhưng tôi nghĩ bạn cần phải tạo một tài khoản để làm điều đó. :) –

+0

Bạn gọi định dạng này là gì? (Tue Jul 13 23:18:36 +0000 2010) – brad

3

Tôi đã tìm thấy phân tích cú pháp ngày jQuery Globalization Plugin để hoạt động tốt nhất. Các phương pháp khác có vấn đề qua trình duyệt và các công cụ như date.js không được cập nhật trong một thời gian ngắn.

Bạn cũng không cần datePicker trên trang. Bạn chỉ có thể gọi một cái gì đó tương tự như ví dụ được đưa ra trong tài liệu:

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

Điều này thật tuyệt vời cho các ngày, nhưng không phân tích cú pháp thời gian. – TelegramSam

1

Đây là những gì tôi đã thực hiện để sửa lỗi này!

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

Và điều này cho tôi "19:38 PM 23 tháng 4 năm 2012" trên Chrome, IE và Firefox.

Các vấn đề liên quan