2010-06-25 10 views
6

Come posso manipolare le date in modo che vengano visualizzate come "solo ora" ... "5 minuti fa" ... "3 ore fa" ... "22 giugno 2010 alle 13:45" in modo simile a in che modo SO visualizza le date accanto alle risposte/ai commenti a ciascuna domanda?Come visualizzare un crossover della data relativo-assoluto?

Per complicare ulteriormente le cose, le date memorizzate nel mio database sono in ora GMT (che va bene), ma voglio che vengano visualizzate nel fuso orario del browser di ciascun utente.

Ho già provato il bel plugin per data di John Resig: http://bassistance.de/jquery-plugins/jquery-plugin-prettydate/ e l'ho modificato in modo da sottrarre l'offset del fuso orario dall'ora GMT nel database. Tuttavia, questa soluzione funziona solo in FireFox.

Ecco la funzione 'prettydate' dopo ho aggiunto l'offset fuso orario:

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: sto usando Python con i modelli di Django (tramite Google Webapp), e l'oggetto 'di tempo' I 'm passando un 'db.DateTimeProperty()' nel formato iso in questo modo:

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

Una domanda da parte di qualcuno che ha utilizzato solo Data casualmente: non è possibile impostare la data utilizzando i metodi setUTC *()? Non si convertirà automaticamente all'ora locale? – brainjam

+0

Grazie, posso provare a farlo. Tuttavia, ciò non aiuta ancora la parte cross browser, che è davvero il problema più grande qui. – Cuga

risposta

2

Perché non fare questo sul lato server, con il built-in template tag timesince, o un tag modello personalizzato?

Nel tempo relativo, non vi è il significato di fusi orari, a condizione che le 2 volte che si sta diffondendo si trovano nella stessa zona. Per i risultati che sono più lontani nel passato e che vuoi presentare come tempi assoluti, dovrai fare il tuo turno di tempo. per questo, dovrete ask the user for her timezone (or use some JS on a previous page to send it to you) e memorizzarlo nel profilo utente.

anche questo è discusso in the mailing list.

+0

Principalmente perché voglio che venga visualizzato il tempo nell'impostazione del fuso orario del browser dell'utente. Mi piace anche l'idea di JavaScript poiché il plug-in di cui sopra aggiorna automaticamente la data ogni 10 secondi in modo che se l'utente lascia aperto il browser, avrà il testo aggiornato. – Cuga

+0

Modificato un po 'sullo spostamento per correggere la zona nell'opzione lato server. –

+0

Hmm In precedenza non volevo chiedere all'utente il suo fuso orario a causa di quegli utenti pubblici che non dispongono di un account che visualizzerà il sito. Penserò/guarderò al link che hai dato di inviare il fuso orario tramite JS da una pagina precedente, anche se preferirei comunque una soluzione JS cross-browser per gli aggiornamenti automatici. – Cuga

Problemi correlati