2010-06-25 4 views
6

Comment puis-je manipuler les dates pour qu'elles apparaissent comme "juste maintenant" ... "Il ya 5 minutes" ... "Il ya 3 heures" ... "22 juin 2010 à 13:45" de manière similaire à comment SO affiche les dates à côté des réponses/commentaires à chaque question? Pour compliquer davantage les choses, les dates stockées dans ma base de données sont en heure GMT (ce qui est bien), mais je veux qu'ils apparaissent dans le fuseau horaire du navigateur de chaque utilisateur.Comment afficher un cross-browsers de date relative à absolue?

J'ai déjà essayé le joli plugin de date de John Resig: http://bassistance.de/jquery-plugins/jquery-plugin-prettydate/, et je l'ai édité pour qu'il soustrait le décalage de fuseau horaire de l'heure GMT dans la base de données. Cependant, cette solution ne fonctionne que dans FireFox.

est ici la fonction 'prettydate' après que je l'ai ajouté le décalage horaire:

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: J'utilise Python avec des modèles Django (via Google Webapp), et l'objet 'temps' I 'M passant dans un « db.DateTimeProperty() » dans le format iso comme ceci:

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

Une question de quelqu'un qui a utilisé occasionnellement Date: ne pouvez-vous pas définir la date en utilisant les méthodes setUTC *()? Ne va-t-il pas se convertir automatiquement en heure locale? – brainjam

+0

Merci, je peux essayer de le faire. Cependant, cela n'aide pas la partie cross browser, ce qui est vraiment le plus gros problème ici. – Cuga

Répondre

2

Pourquoi ne pas faire ce côté serveur, avec le haut-étiquette de modèle timesince, ou un tag modèle personnalisé?

En temps relatif, il n'y a pas de signification pour les fuseaux horaires, tant que les 2 différences sont dans la même zone. Pour les résultats qui sont plus éloignés dans le passé, et que vous voulez présenter comme des temps absolus, vous devrez faire le décalage temporel vous-même. pour cela, vous devrez le ask the user for her timezone (or use some JS on a previous page to send it to you) et le stocker dans le profil utilisateur.

cela est également discuté in the mailing list.

+0

Principalement parce que je veux que l'heure apparaisse dans le réglage de fuseau horaire du navigateur de l'utilisateur. J'aime aussi l'idée de JavaScript puisque le plugin ci-dessus met automatiquement à jour la date toutes les 10 secondes de sorte que si l'utilisateur laisse son navigateur ouvert, il aura le texte mis à jour. – Cuga

+0

Edité un peu à propos de la modification de la zone dans l'option côté serveur. –

+0

Hmm Auparavant, je ne voulais pas demander à l'utilisateur son fuseau horaire à cause des utilisateurs publics qui n'auront pas de compte pour voir le site. Je vais penser à/regarder dans ce lien que vous avez donné d'envoyer le fuseau horaire par JS à partir d'une page précédente, même si je préfère toujours une solution JS cross-navigateur pour les mises à jour automatiques. – Cuga

Questions connexes