2011-01-15 7 views
5

Tengo una aplicación en la que deseo permitir al usuario establecer zonas horarias. Cuando el usuario crea una entrada de recordatorio, la entrada se almacenará en db en UTC. Pero cuando abre la entrada del calendario en la aplicación, debería ver la entrada en su zona horaria seleccionada. Estoy usando Crónico, pero eso es inmaterial aquí.
En mi ApplicationController.rb, que tienen la siguiente secuencia:Timezones en Rails

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

Después de esto, las entradas siguen almacenados en la UTC, pero con la diferencia de tiempo. Por ejemplo, configuré la zona horaria como - "Delhi" que es +530 desde UTC. Cuando quiero guardar la entrada del calendario para "Ene, 16 - 12:15 AM", la base de datos está llena con "2011-01-15 18:45:19 UTC", por lo que es 5:30 horas antes de la hora real que quiero ahorrar.
En la interfaz de usuario también sigo viendo esta entrada en lugar de la hora que se muestra en la zona horaria del usuario actual.

Quiero saber cuál es la forma correcta de manejar este tipo de características de zona horaria en los rieles.

+1

no sé si este enlace va a ayudar, pero es buena-a-saber: http://stackoverflow.com/questions/4529387/does-anyone -know-how-to-apropiadamente-deal-with-user-timezones-in-rails-2-3 – Zabba

Respuesta

8

En la base de datos necesita almacenar la hora en UTC y que para la IU debe convertirla en la zona horaria del usuario.

ejemplo en la consola rieles:

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

Esto no es seguro para subprocesos. (Raspe eso. Parece que Rails almacena esto en Thread.corrent) –