2010-06-25 14 views
6

¿Cómo puedo manipular las fechas para que aparezcan como "ahora mismo" ... "hace 5 minutos" ... "hace 3 horas" ... "22 de junio de 2010 a las 1:45 pm" de manera similar a ¿cómo SO muestra las fechas al lado de las respuestas/comentarios a cada pregunta?¿Cómo mostrar una fecha relativa a absoluta cross-browsers?

Para complicar aún más las cosas, las fechas almacenadas en mi base de datos están en hora GMT (lo cual está bien), pero quiero que aparezcan en la zona horaria del navegador de cada usuario.

Ya he probado el plugin de fechas bonitas de John Resig: http://bassistance.de/jquery-plugins/jquery-plugin-prettydate/, y lo he editado para que sustraiga el desplazamiento de la zona horaria de la hora GMT en la base de datos. Sin embargo, esta solución solo funciona en Firefox.

Aquí está la función de 'prettydate' después de haber añadido el desplazamiento de zona horaria:

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

Editar: estoy usando Python con las plantillas de Django (vía Google Webapp), y el objeto 'tiempo' me estoy pasando un 'db.DateTimeProperty()' en el formato ISO, así:

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

Una pregunta de alguien que solo ha usado la fecha casualmente: ¿no puede establecer la fecha utilizando los métodos setUTC *()? ¿No se convertirá automáticamente a la hora local? – brainjam

+0

Gracias, puedo intentar hacer eso. Sin embargo, eso todavía no ayuda a la parte del navegador cruzado, que es realmente el problema más grande aquí. – Cuga

Respuesta

2

¿por qué no esta del lado del servidor, con el incorporado en la etiqueta de plantilla timesince, o una etiqueta de plantilla personalizada?

En tiempo relativo, no hay significado para las zonas horarias, siempre que las 2 veces que esté difuminando estén en la misma zona. Para los resultados que están más lejos en el pasado, y desea presentarlos como tiempos absolutos, tendrá que hacer el cambio de hora usted mismo. para esto, tendrá que ask the user for her timezone (or use some JS on a previous page to send it to you) y almacenarlo en el perfil del usuario.

esto también se discute in the mailing list.

+0

Sobre todo porque quiero que el tiempo se muestre en la configuración de zona horaria del navegador del usuario. También me gusta la idea de JavaScript, ya que el complemento anterior actualiza automáticamente la fecha cada 10 segundos, de modo que si el usuario deja su navegador abierto, tendrá el texto actualizado. – Cuga

+0

Editado un poco sobre el cambio a la zona correcta en la opción del lado del servidor. –

+0

Hmm Anteriormente no había querido preguntar al usuario por su zona horaria debido a los usuarios públicos que no tendrán una cuenta que verá el sitio. Pensaré/veré ese enlace que me brindó al enviar la zona horaria a través de JS desde una página anterior, aunque preferiría una solución JS de navegador cruzado para las actualizaciones automáticas. – Cuga

Cuestiones relacionadas