Rieles: convertir UTC DateTime a otra zona horaria

En Ruby / Rails, ¿cómo convierto un DateTime de UTC a otra zona horaria?

time.in_time_zone(time_zone) 

Ejemplo:

 zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)") Time.now.in_time_zone(zone) 

o solo

 Time.now.in_time_zone("Central Time (US & Canada)") 

Puede encontrar los nombres de las zonas horarias de ActiveSupport haciendo lo siguiente:

 ActiveSupport::TimeZone.all.map(&:name) # or for just US ActiveSupport::TimeZone.us_zones.map(&:name) 

Si Time.zone es su zona horaria deseada, puede usar @date.to_time.to_datetime

 > @date => Tue, 02 Sep 2014 23:59:59 +0000 > @date.class => DateTime > @date.to_time => 2014-09-02 12:59:59 -1100 > @date.to_time.to_datetime => Tue, 02 Sep 2014 12:59:59 -1100 

Pruebe los objetos TimeWithZone de ActiveSupport manipulados con TimeZone. ActiveSupport también proporciona el método in_time_zone para convertir una hora UTC en un huso horario específico. La respuesta de mckeed muestra el código.

Por si acaso, si está tratando con el objeto ActiveRecord en Rails.

Podría ser una buena idea usar Time.use_zone para una zona horaria por base de solicitud que invalida la zona horaria predeterminada establecida en config.time_zone

Más detalles que explico en https://stackoverflow.com/a/25055692/542995

En ruby ​​simple, con solo require 'date' , use el método new_offset :

 require 'date' d=DateTime.parse('2000-01-01 12:00 +0200') l=d.new_offset('-0700') u=l.new_offset('UTC') puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}" 

Probado con ruby ​​2.3.7 que vino de serie en Mac OS X 10.13.

Estoy usando simple_form en Rails 4 y acabo de agregar el campo de entrada como

 <%= f.input :time_zone, :as => :time_zone %> 

con la migración

 class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration def change add_column :textmessages, :time_zone, :string end end