2010-06-25 13 views
6

Jak manipulować datami, aby wyświetlały się jako "właśnie teraz" ... "5 minut temu" ... "3 godziny temu" ... "22 czerwca 2010 o 13:45" w podobny sposób jak jak SO wyświetla daty obok odpowiedzi/komentarzy do każdego pytania?Jak wyświetlać względne do bezwzględnych przeglądarki o różnych datach?

Aby jeszcze bardziej skomplikować sprawy, daty przechowywane w mojej bazie danych są w czasie GMT (co jest w porządku), ale chcę, aby pojawiły się w strefie czasowej przeglądarki każdego użytkownika.

Wypróbowałem już wtyczkę z datą piękną John'a Resig: http://bassistance.de/jquery-plugins/jquery-plugin-prettydate/ i zredagowałem ją tak, aby odejmowała przesunięcie strefy czasowej od czasu GMT w bazie danych. Jednak to rozwiązanie działa tylko w FireFox.

Oto funkcja 'prettydate' po Dodałem strefę czasową offset:

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: Używam Pythona w szablonach Django (przez Google webapp), a 'czas' obiekt I „m przechodzącą w«db.DateTimeProperty()»w formacie iso tak:

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

Pytanie od kogoś, kto używał tylko daty Niedokładnie: nie możesz ustawić daty za pomocą metody setUTC *()? Czy nie po prostu automatycznie przekształci się w czas lokalny? – brainjam

+0

Dzięki, mogę spróbować to zrobić. Jednak to nadal nie pomaga w przypadku przeglądarki krzyżowej, która jest tutaj naprawdę większym problemem. – Cuga

Odpowiedz

2

Dlaczego nie zrobić tego po stronie serwera, z wbudowanego szablonu tagu timesince lub znacznika niestandardowego szablonu?

W czasie względnym nie ma znaczenia stref czasowych, o ile 2-krotne różnice występują w tej samej strefie. Aby uzyskać wyniki, które znajdują się w odległej przeszłości i chcesz przedstawić je jako czasy absolutne, sam musisz dokonać przesunięcia czasowego. w tym celu musisz ask the user for her timezone (or use some JS on a previous page to send it to you) i zapisać go w profilu użytkownika.

jest to również omówione in the mailing list.

+0

Głównie dlatego, że chcę, aby czas pojawiał się w ustawieniach strefy czasowej przeglądarki użytkownika. Podoba mi się również pomysł JavaScript, ponieważ powyższa wtyczka automatycznie aktualizuje datę co 10 sekund, więc jeśli użytkownik opuści przeglądarkę, będzie miał zaktualizowany tekst. – Cuga

+0

Edytowano trochę o przesunięciu do właściwej strefy po stronie serwera. –

+0

Hmm Wcześniej nie chciałem pytać użytkownika o jego strefę czasową z powodu tych publicznych użytkowników, którzy nie będą mieć konta, które będzie przeglądać witrynę. Zastanowię się nad tym linkiem, który podałeś, wysyłając strefę czasową za pośrednictwem JS z poprzedniej strony, ale nadal wolałbym rozwiązanie JS dla różnych przeglądarek dla automatycznych aktualizacji. – Cuga

Powiązane problemy