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