¿Por qué `config.time_zone` no parece hacer nada?

En application.rb , dice:

Establezca Time.zone predeterminado en la zona especificada y haga que Active Record se convierta automáticamente a esta zona. Ejecute “rake -D time” para obtener una lista de tareas para buscar nombres de zonas horarias. El valor predeterminado es UTC.

Pero configurar config.time_zone = 'Central Time (US & Canada)' o config.time_zone = 'Eastern Time (US & Canada)' no tiene ningún efecto: el campo created_at en un modelo aún se guarda en UTC.

De acuerdo con esta respuesta railsforum :

config.time_zone solo le permite a los Rails saber que su servidor está configurado en esta zona horaria para que cuando escriba fechas en la base de datos pueda convertirlo correctamente a UTC.

Si eso es cierto, ¿por qué es que cuando la hora de mi sistema es hora del Pacific Time (US & Canada) y config.time_zone = 'Central Time (US & Canada)' o config.time_zone = 'Eastern Time (US & Canada)' , que el tiempo created_at es el UTC correcto? ¿No debería ser incorrecto?

Porque, si el tiempo PST es 8 PM, entonces EST es 11 PM y UTC es 4 AM. Suponiendo que Rails haga Time.now , eso sería las 8 PM. Y le dijimos a Rails que el servidor está en EST. Entonces, 8 PM sería hora EST en lo que respecta a Rails y el UTC sería entonces 5 AM UTC, lo que sería incorrecto (porque la hora actual es 8 PM PST / 11 PM EST, que es 4 AM UTC)

¿Que está pasando aqui?

Aquí hay una lista de conceptos y cosas que pueden ayudarlo:

config.time_zone no establece “Server Time”, que es controlado por su sistema operativo por lo general.

Rails siempre almacena sus fechas en UTC en la base de datos (a menos que cambie una configuración diferente).

Time.now devuelve el tiempo local de su computadora en su zona horaria y también incluye el desplazamiento de la zona horaria local desde su sistema operativo, lo que significa que Ruby y, por lo tanto, Rails sabe cómo convertir la hora local en UTC. Puede probar esto usando irb directamente, para que no se carguen las bibliotecas de Rails:

 ctcherry$ irb >> Time.now => Mon Feb 21 20:53:14 -0800 2011 >> 

Si config.time_zone , o Time.zone está configurado, para decir EST, Rails espera que si establece un atributo de fecha y hora que quiere decir para esa hora y fecha para estar en la zona horaria especificada, en este caso EST. Es por eso que establece Time.zone igual a la zona horaria de los usuarios finales, para que puedan usar su hora y fechas locales, y puede pasarlas directamente a sus modelos ActiveRecord y Rails puede convertirlo a UTC para el almacenamiento en la base de datos.

¿Eso ayuda en absoluto?

Necesita usar in_time_zone (es decir, Time.now.in_time_zone ) para obtener algo que no sea UTC.