2010-12-06 15 views
28

J'ai un problème assez commun, mais pour une raison quelconque, j'ai essayé toutes les suggestions sur le web et aucun ne semble fonctionner.Fuseau horaire avec rails 3

J'ai mis le Timezone dans la configuration de « EST »

config.time_zone = 'Eastern Time (US & Canada)' 

Mais lorsque le temps est affiché sur l'écran, il continue d'afficher l'heure UTC qui est stockée dans la DB. J'ai essayé le débogueur et voici la sortie

(rdb:1) Time.zone 
#<ActiveSupport::TimeZone:0x1061f4760 @utc_offset=nil, @current_period=nil, @name="Eastern Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/New_York>> 
(rdb:1) Order.first.placed_at 
Fri Jan 01 15:00:00 UTC 2010 

Mise à jour: Voici un autre utilisateur qui a la même question Rails timezone is wrong when shown

+0

Plus sur Timezones: http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html –

Répondre

36

Essayez in_time_zone. Par exemple

>> Time.now 
=> Sun Dec 05 21:34:45 -0500 2010 
>> Time.zone 
=> #<ActiveSupport::TimeZone:0x1033d97b8 @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::DataTimezone: America/Los_Angeles>, @utc_offset=-28800, @current_period=nil> 
>> Time.now.in_time_zone 
=> Sun, 05 Dec 2010 18:34:54 PST -08:00 

Dans votre cas, vous voulez Order.first.placed_at.in_time_zone.

+4

Mais je pensais régler le fuseau horaire dans la config dira automatiquement à activerecord de récupérer dans le fuseau horaire local. http://ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones – Addy

+0

Dans mon expérience, je a dû explicitement dire à la vue d'utiliser le fuseau horaire local (au lieu de UTC). Peut-être existe-t-il un meilleur moyen. –

+0

Cela me rendait fou. Merci beaucoup! :-) –

2

Vérifiez que votre ActiveRecord::Base.time_zone_aware_attributes est true.

11

Si vous souhaitez définir un fuseau horaire différent pour les différents utilisateurs de votre application, assurez-vous d'utiliser un around_filter par opposition à un avant filtre pour changer Time.zone. Quelque chose à voir avec la façon dont Time.zone se fuit vers d'autres threads et ainsi d'autres utilisateurs peuvent hériter d'un fuseau horaire qu'ils ne devraient pas. A partir de ce blog: http://ilikestuffblog.com/2011/02/03/how-to-set-a-time-zone-for-each-request-in-rails/

dans application_controller.rb:

around_filter :set_time_zone 

private 

def set_time_zone 
    old_time_zone = Time.zone 
    Time.zone = current_user.time_zone if logged_in? 
    yield 
ensure 
    Time.zone = old_time_zone 
end 

J'ai aussi trouvé utile d'utiliser la méthode d'aide du formulaire de time_zone_select en permettant aux utilisateurs de changer leur fuseau horaire. Si vous avez appelé votre champ: time_zone, vous l'utiliser comme:

f.time_zone_select(:time_zone) 

Et enfin, cela semble assez impressionnant. Détection automatique et réglage du fuseau horaire via javascript. Voici le petit bijou de rails pour ajouter au pipeline d'actifs: https://github.com/scottwater/detect_timezone_rails et blog d'accompagnement: http://www.scottw.com/automated-timezone-detection

+0

réponse parfaite, si vous me demandez !! – pungoyal