Em Ruby / Rails, como faço para converter um DateTime UTC para outro fuso horário?
Em Ruby / Rails, como faço para converter um DateTime UTC para outro fuso horário?
Respostas:
time.in_time_zone(time_zone)
Exemplo:
zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)
ou apenas
Time.now.in_time_zone("Central Time (US & Canada)")
Você pode encontrar os nomes dos fusos horários do ActiveSupport fazendo:
ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
require 'active_support/time'
primeiro.
rake time:zones:all
. Veja também rake -D time
. Defina o fuso horário padrão em config/application.rb
.
se Time.zone
for o fuso horário desejado, você pode 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
Em rubi puro, com apenas require 'date'
, use o new_offset
método:
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')}"
Testado com ruby 2.3.7 que veio como padrão no Mac OS X 10.13.
Experimente objetos TimeWithZone do ActiveSupport manipulados com TimeZone. ActiveSupport também fornece o método in_time_zone para converter um horário UTC em um fuso horário especificado. A resposta de mckeed mostra o código.
Apenas no caso, se você está lidando com o objeto ActiveRecord no Rails.
Pode ser uma boa ideia usar Time.use_zone
um fuso horário por solicitação que substitua o fuso horário padrão definido emconfig.time_zone
Mais detalhes eu explico em https://stackoverflow.com/a/25055692/542995
Estou usando o simple_form no Rails 4 e acabei de adicionar o campo de entrada como
<%= f.input :time_zone, :as => :time_zone %>
com a migração
class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
def change
add_column :textmessages, :time_zone, :string
end
end