2010-10-27 5 views
13

Je suis un peu confus au sujet des fuseaux horaires dans les rails. Je veux que l'application de mes rails utilise l'heure d'été britannique (comme l'heure d'été aux États-Unis) pour les timestamps définis dans updated_at et created_at dans mes modèles. J'ai changé environment.rb direLes horodatages Rails n'utilisent pas le bon fuseau horaire

config.time_zone = 'London' 

Le serveur ubuntu mon application est semble utiliser BST pour son temps: dans la ligne de commande, par exemple, si i type « date » je reçois l'heure actuelle (pas compensé par une heure). Dans la console rails, je vois ce qui suit:

>> time = Time.now 
=> Wed Oct 27 16:29:17 +0100 2010 
>> time.zone 
=> "BST" 

Tout va bien. Cependant, si je crée un nouvel objet de modèle AR et que je l'enregistre, les horodatages datent d'il y a une heure. Donc, il semble que ce soit en utilisant UTC. Maintenant, je peux voir la logique dans cela: puisque les horodateurs peuvent être utilisés dans la logique du modèle, vous voulez qu'ils soient basés sur un temps de référence invariable, à savoir UTC. Mais, cela est un peu bizarre de comportement que je ne comprends pas:

#change a record and save it 
>> someobj.save 
=> true 
#object's updated_at is one hour ago 
>> someobj.updated_at 
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00 
>> Time.now 
=> Wed Oct 27 16:34:31 +0100 2010 
#however, Time.now - object's updated at is just a few seconds. 
>> Time.now - someobj.updated_at 
=> 15.305549 

Ainsi, avant de faire la soustraction, updated_at est converti en fuseau horaire. La raison pour laquelle je veux afficher la date dans le fuseau horaire actuel est juste pour les rapports d'état etc dans les vues: si quelqu'un met à jour quelque chose je veux qu'ils voient qu'il a été mis à jour il y a '1 minute' '.

Quelqu'un peut-il me déconseiller? acclamations, max

EDIT: Mon problème immédiat, de montrer le bon moment dans l'état, est résolu en utilisant l'assistant 'time_ago_in_words', qui ajuste le fuseau horaire. J'aimerais quand même que quelqu'un explique ce qui se passe avec les horodateurs. :)

Répondre

38

Les horodatages sont stockés dans UTC par défaut, et c'est probablement la meilleure façon de le faire. Si vous passez d'un environnement de serveur à un autre, vous ne voulez pas que tout votre temps se déplace juste parce que vous avez changé de fuseau horaire.

Si vous voulez savoir ce que l'horodatage est dans votre fuseau horaire, il vous suffit de demander cette façon:

someobj.updated_at.localtime 
+0

ah - c'est super. Merci! Je suis d'accord qu'il est logique de les garder tous en UTC. –

+0

ok, je l'ai eu. mais si je veux afficher l'heure locale sur le datetime sélectionnez sur ma vue que puis-je faire? – Diego

+0

Probablement le meilleur moyen est d'utiliser une méthode JavaScript pour mapper les heures système aux heures locales du navigateur. C'est une autre question cependant. – tadman

2

Notez le décalage indiqué à la fin des temps - le premier décalage est 0, le second est 1. Lorsque le calcul du temps se produit, le décalage est inclus automatiquement, de sorte que la soustraction vous donne le résultat correct. someobj.updated_at et Time.now affichent chacun sa valeur dans un fuseau horaire différent, de sorte qu'ils ne sont vraiment qu'à 9 secondes d'intervalle, et non 1 heure et 9 secondes.

Questions connexes