2011-01-15 20 views
5

Mam aplikację, w której chcę zezwolić użytkownikowi na ustawianie stref czasowych. Gdy użytkownik utworzy wpis przypomnienia, wpis zostanie zapisany w db w UTC. Ale kiedy otwiera pozycję kalendarza w aplikacji, powinien zobaczyć wpis w wybranej strefie czasowej. Używam Chronicznego, ale to jest tutaj bez znaczenia.
W moim ApplicationController.rb, mam następujący ciąg:Strefy czasowe w szynach

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

po tym, wpisy są nadal zapisane w UTC, ale z różnicą czasu. Na przykład ustawiam strefę czasową jako - "Delhi", która wynosi +530 od czasu UTC. Kiedy chcę zapisać pozycję kalendarza dla "Jan, 16 - 12:15" - baza danych jest wypełniona "2011-01-15 18:45:19 UTC" - czyli 5:30 godziny przed właściwym czasem zapisać.
W interfejsie użytkownika również widzę ten wpis zamiast czasu wyświetlanego w strefie czasowej bieżącego użytkownika.

Chcę wiedzieć, jaki powinien być właściwy sposób obsługi tego rodzaju funkcji strefy czasowej w szynach.

+1

ja nie wiem, czy ten link pomoże, ale jest to dobry-do-wiedzieć: http://stackoverflow.com/questions/4529387/does-anyone -tnow-jak-odpowiednio-radzić-z-użytkownika-strefami czasowymi-w-torach-2-3 – Zabba

Odpowiedz

8

W bazie danych należy przechowywać czas w UTC, a następnie dla interfejsu użytkownika, aby przekonwertować go w strefie czasowej użytkownika.

przykład w konsoli szyn:

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

To nie jest bezpieczne dla wątków. (Zdrapcie to, wydaje się, że railsy przechowuje to w Thread.current) –