Mes created_at
horodatages sont stockés en UTC:
>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00
Comment puis-je convertir l'un d'entre eux en 'Heure de l'Est (États-Unis et Canada)' (en tenant compte de l'heure d'été)? Quelque chose comme:
Annotation.last.created_at.in_eastern_time
ruby-on-rails
ruby
datetime
Tom Lehman
la source
la source
now.in_time_zone(3)
created_at.in_time_zone("EST")
est plus courteBien que ce soit une vieille question, cela vaut la peine de mentionner quelque chose. Dans une réponse précédente, il est suggéré d'utiliser un before_filter pour définir le fuseau horaire temporellement.
Vous ne devriez jamais, jamais faire cela car Time.zone stocke les informations dans le thread, et il sera probablement divulgué à la prochaine requête gérée par ce thread.
À la place, vous devez utiliser un around_filter pour vous assurer que Time.zone est réinitialisé une fois la requête terminée. Quelque chose comme:
En savoir plus à ce sujet ici
la source
Si vous ajoutez ceci à votre
/config/application.rb
Alors tu peux cellule
pour obtenir l'heure dans le fuseau horaire spécifié.
la source
Si vous configurez votre
/config/application.rb
la source
Réglez votre fuseau horaire sur l'heure de l'Est.
Vous pouvez définir votre fuseau horaire par défaut dans config / environment.rb
Désormais, tous les enregistrements que vous retirez seront dans ce fuseau horaire. Si vous avez besoin de différents fuseaux horaires, par exemple en fonction d'un fuseau horaire utilisateur, vous pouvez le modifier avec un before_filter dans votre contrôleur.
Assurez-vous simplement de stocker tous vos temps dans la base de données au format UTC et tout sera agréable.
la source
Time.zone=
est thread-safe github.com/rails/rails/blob/master/activesupport/lib/… .