2010-10-27 8 views
13

Estoy un poco confundido acerca de las zonas horarias en los rieles. Quiero que mi aplicación Rails use el horario de verano británico (como horario de verano en los EE. UU.) Para las marcas de tiempo establecidas en updated_at y created_at en mis modelos. He cambiado de environment.rb decirLas marcas de tiempo de los rieles no usan la zona horaria correcta

config.time_zone = 'London' 

El servidor ubuntu mi aplicación está en parece utilizar BST por su tiempo: en la línea de comandos, por ejemplo, si el tipo i 'fecha' i obtener la hora actual (no compensado por una hora). En la consola de rieles, veo lo siguiente:

>> time = Time.now 
=> Wed Oct 27 16:29:17 +0100 2010 
>> time.zone 
=> "BST" 

Todo bien. Sin embargo, si hago un nuevo objeto de modelo de AR y lo guardo, las marcas de tiempo son de hace una hora. Entonces, parece que esto está usando UTC. Ahora, puedo ver la lógica en esto: dado que las marcas de tiempo pueden usarse en la lógica del modelo, quiere que se basen en un tiempo de criterio invariable, es decir UTC. Sin embargo, esto es un poco raro de comportamiento que no entiendo:

#change a record and save it 
>> someobj.save 
=> true 
#object's updated_at is one hour ago 
>> someobj.updated_at 
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00 
>> Time.now 
=> Wed Oct 27 16:34:31 +0100 2010 
#however, Time.now - object's updated at is just a few seconds. 
>> Time.now - someobj.updated_at 
=> 15.305549 

Por lo tanto, antes de hacer la resta, updated_at se convierte en la zona horaria actual.

El motivo por el que quiero mostrar la fecha en el huso horario actual es solo para informes de estado, etc. en las vistas: si alguien actualiza algo, quiero que lo vean actualizado '1 minuto atrás' no 'hace una hora '.

¿Alguien puede desconfundirme? vivas, max

EDITAR: Mi problema inmediato, de mostrar el momento correcto en el estado, se resuelve utilizando el helper 'time_ago_in_words', que se ajusta para la zona horaria. Sin embargo, me gustaría que alguien me explique qué ocurre con las marcas de tiempo :)

Respuesta

38

Las marcas de tiempo se almacenan en UTC de manera predeterminada, y esta es probablemente la mejor manera de hacerlo. Si se mueve de un entorno de servidor a otro, no desea que todos sus tiempos cambien solo porque cambió de zona horaria.

Si usted quiere saber lo que es la marca de tiempo en su zona horaria local, sólo hay que preguntar por ella de esa manera:

someobj.updated_at.localtime 
+0

ah - eso es genial. ¡Gracias! Estoy de acuerdo en que mantenerlos a todos en UTC tiene sentido. –

+0

bien, lo tengo. pero si quiero mostrar la hora local en la fecha y hora, seleccione en mi vista ¿qué puedo hacer? – Diego

+0

Probablemente la mejor manera es usar un método de JavaScript para mapear los tiempos del sistema a las horas locales del navegador. Esa es otra pregunta sin embargo. – tadman

2

Tenga en cuenta la compensación enumerada al final de los tiempos: la primera compensación es 0, la segunda es 1. Cuando se produce el cálculo de la hora, el desplazamiento se incluye automáticamente, de modo que la resta le da el resultado correcto. someobj.updated_at y Time.now cada uno muestra su valor en una zona horaria diferente, por lo que realmente están separados por 9 segundos, no 1 hora y 9 segundos.

Cuestiones relacionadas