web-dev-qa-db-fra.com

Timezone avec Rails 3

J'ai un problème assez courant, mais pour une raison quelconque, j'ai essayé toutes les suggestions sur le Web et que personne ne semble fonctionner.

J'ai défini le fuseau horaire dans la configuration "Est"

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

Mais lorsque le temps est affiché à l'écran, il continue de montrer l'heure UTC 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 est faux lorsqu'il est affiché

28
Addy

Essayer 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.

36
Paul Schreiber

Si vous voulez définir un champ d'heure différent pour différents utilisateurs de votre application , assurez-vous d'utiliser un whide_filter par opposition à un filtre avant de changer de temps. zone. Quelque chose à voir avec la façon dont le temps. Les fuites à d'autres discussions et d'autres utilisateurs peuvent donc inhibérer un fuseau horaire qu'ils ne devraient pas. De ce blog Post: http://ilikestuffblog.com/2011/02/03/how-to-se-a-time-zone-for-each-request-in-rils/

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 également trouvé utile d'utiliser le TIME_ZONE_SLIRECTE Formulaire de méthode d'assistance lorsque vous permettant aux utilisateurs de changer de fuseau horaire. Si vous avez appelé votre champ: Time_Zone, vous l'utiliseriez comme:

f.time_zone_select(:time_zone)

Et enfin, cela a l'air plutôt génial. Détecter automatiquement et définir une fuseau horaire via JavaScript . Voici le Rails GEM à ajouter au pipeline d'actif: https://github.com/scottwater/detect_timezone_rails et liste de blog d'accompagnement: http://wwww.scottw.com/automated-timezone-detection

11
Danny

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

2
Duke

Je pense que ce que vous décrivez, c'est ce bogue - https://github.com/rails/rails/issues/6816

0
joshnabbott