2011-01-15 5 views
5

J'ai une application où je veux permettre à l'utilisateur de définir des fuseaux horaires. Lorsque l'utilisateur crée une entrée de rappel, l'entrée sera stockée en db en UTC. Mais quand il ouvre l'entrée du calendrier dans l'application, il devrait voir l'entrée dans son fuseau horaire sélectionné. J'utilise Chronic mais c'est immatériel ici.
Dans mon ApplicationController.rb, j'ai la chaîne suivante:Timezones in Rails

before_filter :set_user_time_zone 
... 
def set_user_time_zone 
    Time.zone = current_user.timezone if user_signed_in? 
end 

Après cela, les entrées sont toujours enregistrées en UTC mais avec la différence de temps. Par exemple, j'ai défini le fuseau horaire comme - "Delhi" qui est +530 de l'UTC. Lorsque je veux enregistrer l'entrée de calendrier pour "Jan, 16 - 12:15 AM" - la base de données est remplie avec "2011-01-15 18:45:19 UTC" - donc ses 5:30 heures avant l'heure réelle que je veux sauver.
Dans l'interface utilisateur, je continue à voir cette entrée au lieu de l'heure affichée dans le fuseau horaire de l'utilisateur actuel.

Je veux savoir quelle devrait être la bonne façon de gérer ce type de fonctions de fuseau horaire dans les rails.

+1

Je ne sais pas si ce lien aider, mais il est bon à savoir: http://stackoverflow.com/questions/4529387/does-anyone -know-comment-traiter-convenablement-avec-user-timezones-in-rails-2-3 – Zabba

Répondre

8

Dans la base de données, vous devez stocker l'heure en UTC et, pour l'interface utilisateur, vous devez la convertir dans le fuseau horaire de l'utilisateur.

Exemple dans la console rails:

Time.zone = "New Delhi"   #=> "New Delhi" 

Time.now      # => 2011-01-15 16:45:18 -0600 

Time.now.in_time_zone   # => Sun, 16 Jan 2011 04:15:26 IST +05:30 
+0

Ce n'est pas sûr pour les threads. (Grattez ça, il semble que les rails stockent ça dans Thread.current) –