2010-06-25 38 views
6

Làm cách nào tôi có thể thao tác ngày để chúng hiển thị là "vừa mới" ... "5 phút trước" ... "3 giờ trước" ... "ngày 22 tháng 6 năm 2010 lúc 1:45 chiều" theo cách tương tự cách SO hiển thị ngày bên cạnh câu trả lời/nhận xét cho mỗi câu hỏi?Làm cách nào để hiển thị các trình duyệt chéo ngày tương đối đến tuyệt đối?

Để các vấn đề phức tạp hơn, ngày được lưu trữ trong cơ sở dữ liệu của tôi là theo giờ GMT (điều này là tốt), nhưng tôi muốn chúng xuất hiện trong múi giờ của từng trình duyệt của người dùng.

Tôi đã thử plugin ngày tháng đẹp của John Resig: http://bassistance.de/jquery-plugins/jquery-plugin-prettydate/ và tôi đã chỉnh sửa nó để nó trừ chênh lệch múi giờ từ giờ GMT trong cơ sở dữ liệu. Tuy nhiên, giải pháp này chỉ hoạt động trong FireFox.

Đây là chức năng 'prettydate' sau khi tôi đã thêm múi giờ bù đắp:

format : function(time) { 
var date = new Date(time); 
var currentDate = new Date(); 
var timezoneOffsetInMilliseconds = currentDate.getTimezoneOffset() * 60000; 
var currentTimeInMillisecondsUtc = currentDate.getTime(); 
var givenTimeInMillisecondsUtc = date.getTime()- timezoneOffsetInMilliseconds; 
var diffInSeconds = ((currentTimeInMillisecondsUtc - givenTimeInMillisecondsUtc)/1000); 
var day_diff = Math.floor(diffInSeconds/86400); 

if (isNaN(day_diff) || day_diff < 0) 
    return; 

     // If longer than a month, calculate the date w/ timezone offset 
     if (day_diff >= 31) 
      return new Date(givenTimeInMillisecondsUtc).toLocaleString(); 

     var messages = $.prettyDate.messages; 
     return day_diff == 0 && (diffInSeconds < 60 && messages.now 
      || diffInSeconds < 120 && messages.minute 
      || diffInSeconds < 3600 
      && messages.minutes(Math.floor(diffInSeconds/60)) 
      || diffInSeconds < 7200 && messages.hour || diffInSeconds < 86400 
      && messages.hours(Math.floor(diffInSeconds/3600))) 
      || day_diff == 1 && messages.yesterday || day_diff < 7 
      && messages.days(day_diff) || day_diff < 31 
      && messages.weeks(Math.ceil(day_diff/7)); 
    } 

Edit: Tôi đang sử dụng Python với Django mẫu (thông qua Google webapp), và 'thời gian' đối tượng tôi 'm đi qua trong một 'db.DateTimeProperty()' trong các định dạng iso như vậy:

<span class="prettyDate" title='{{ q.date.isoformat }}'>{{q.date.isoformat}}</span> 
+0

Câu hỏi từ người nào đó chỉ sử dụng Ngày tình cờ: bạn không thể đặt ngày bằng cách sử dụng các phương thức setUTC *()? Nó sẽ không tự động chuyển đổi thành giờ địa phương? – brainjam

+0

Cảm ơn, tôi có thể thử làm điều đó. Tuy nhiên, điều đó vẫn không giúp phần trình duyệt chéo, mà thực sự là vấn đề lớn hơn ở đây. – Cuga

Trả lời

2

tại sao không làm điều này server-side, với built-in mẫu thẻ timesince, hoặc một mẫu thẻ tùy chỉnh?

Trong thời gian tương đối, không có ý nghĩa về múi giờ, miễn là 2 lần bạn đang phân biệt nằm trong cùng một vùng. Đối với các kết quả xa hơn trong quá khứ, và bạn muốn trình bày như là thời gian tuyệt đối, bạn sẽ phải làm việc thay đổi thời gian cho mình. cho điều này, bạn sẽ phải ask the user for her timezone (or use some JS on a previous page to send it to you) và lưu trữ nó trong hồ sơ người dùng.

điều này cũng được thảo luận in the mailing list.

+0

Chủ yếu là vì tôi muốn thời gian hiển thị trong cài đặt múi giờ của trình duyệt của người dùng. Tôi cũng thích ý tưởng về JavaScript vì plugin ở trên tự động cập nhật ngày cứ sau 10 giây để nếu người dùng rời khỏi trình duyệt của họ mở, nó sẽ có văn bản cập nhật. – Cuga

+0

Đã chỉnh sửa một chút về việc dịch chuyển sang vùng chính xác trong tùy chọn phía máy chủ. –

+0

Hmm Trước đó tôi không muốn hỏi người dùng về múi giờ của mình vì những người dùng công khai sẽ không có tài khoản sẽ xem trang web đó. Tôi sẽ suy nghĩ về/nhìn vào liên kết mà bạn đã gửi của múi giờ thông qua JS từ một trang trước đó, mặc dù tôi vẫn thích một giải pháp JS trình duyệt chéo cho các bản cập nhật tự động. – Cuga

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