Convertir tiempo de una zona horaria a otra en Rails

Mis created_at tiempo created_at se almacenan en UTC:

 >> Annotation.last.created_at => Sat, 29 Aug 2009 23:30:09 UTC +00:00 

¿Cómo convierto uno de ellos a “Hora del Este (EE. UU. Y Canadá)” (teniendo en cuenta el horario de verano)? Algo como:

 Annotation.last.created_at.in_eastern_time 

Use el método in_time_zone de la clase DateTime

 Loading development environment (Rails 2.3.2) >> now = DateTime.now.utc => Sun, 06 Sep 2009 22:27:45 +0000 >> now.in_time_zone('Eastern Time (US & Canada)') => Sun, 06 Sep 2009 18:27:45 EDT -04:00 >> quit 

Entonces, para su ejemplo particular

 Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)') 

Aunque esta es una vieja pregunta, vale la pena mencionar algo. En una respuesta anterior, se sugiere utilizar un before_filter para establecer temporalmente la zona horaria.

Nunca debes hacer eso nunca porque Time.zone almacena la información en el hilo y probablemente se filtre a la siguiente solicitud manejada por ese hilo.

En su lugar, debe usar un filtro around_ para asegurarse de que Time.zone se restablezca una vez que se complete la solicitud. Algo como:

 around_filter :set_time_zone private def set_time_zone old_time_zone = Time.zone Time.zone = current_user.time_zone if logged_in? yield ensure Time.zone = old_time_zone end 

Lea más sobre esto aquí

Si agrega esto a su /config/application.rb

 config.time_zone = 'Eastern Time (US & Canada)' 

Entonces puedes celular

 Annotation.last.created_at.in_time_zone 

para obtener el tiempo en la zona horaria especificada.

Establezca su zona horaria en hora del este.

Puede configurar su zona horaria predeterminada en config / environment.rb

 config.time_zone = "Eastern Time (US & Canada)" 

Ahora todos los registros que retire estarán en esa zona horaria. Si necesita diferentes zonas horarias, por ejemplo, según la zona horaria del usuario, puede cambiarla con un filtro anterior en su controlador.

 class ApplicationController < ActionController::Base before_filter :set_timezone def set_timezone Time.zone = current_user.time_zone end end 

Solo asegúrate de almacenar todos tus tiempos en la base de datos como UTC y todo será agradable.

Si configura su /config/application.rb

 config.time_zone = 'Eastern Time (US & Canada)' Time.now.in_time_zone DateTime.now.in_time_zone