27 votes

Fuseau horaire avec rails 3

J'ai assez commun de la question, mais pour une raison que j'ai essayé toutes les suggestions sur le web et aucune ne semble fonctionner.

J'ai régler le Fuseau horaire dans la configuration de 'EST'

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

Mais quand le temps est indiqué sur l'écran, il continue d'afficher l'heure UTC qui est stocké dans la base de données. J'ai essayé le débogueur et voici le résultat

(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 de fuseau horaire est le problème quand montré

35voto

Paul Schreiber Points 7214

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 .

11voto

Danny Points 1459

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 plutôt qu'une avant de filtre à changer le Temps.la zone. Quelque chose à voir avec la façon dont le Temps.zone de fuites sur les autres threads et ainsi les autres utilisateurs peuvent inheret une zone de temps qu'ils ne le sont pas. À partir de ce post de 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 le time_zone_select forme de la méthode d'assistance pour autoriser les utilisateurs à modifier leur horaire. Si vous avez appelé votre domaine :time_zone, vous pouvez l'utiliser comme:

f.time_zone_select(:time_zone)

Et enfin, cela ressemble assez impressionnant. Détection automatique et réglage du fuseau horaire via javascript. Voici le gem rails pour ajouter à l'asset pipeline: https://github.com/scottwater/detect_timezone_rails et de l'accompagnement post de blog: http://www.scottw.com/automated-timezone-detection

2voto

Duke Points 2752

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

0voto

joshnabbott Points 37

Je pense que ce que vous décrivez est ce bug - https://github.com/rails/rails/issues/6816

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X