Você já quis usar Ruby puro para obter uma Time
instância em um fuso horário específico? Eu também.
Existem muitos posts na web sobre como fazer isso ActiveSupport::TimeWithZone
, mas às vezes você quer um pequeno script que não tenha nenhuma dependência.
Ruby examina a TZ
variável de ambiente para determinar em qual fuso horário ela deve estar operando. Aqui está uma pequena função de wrapper que define o fuso horário como você deseja, executa a ação Time necessária e restaura a variável de ambiente ao seu valor anterior.
require 'time'
def format_time time_str
old_tz = ENV['TZ']
return if time_str.nil?
ENV['TZ'] = 'America/New_York'
Time.parse time_str
ensure
ENV['TZ'] = old_tz
end
Aqui está um exemplo de sessão:
Time.parse 'Aug 04'
#=> 2014-08-04 00:00:00 -0700
format_time 'Aug 04'
#=> 2014-08-04 00:00:00 -0400
Time.parse 'Aug 04'
#=> 2014-08-04 00:00:00 -0700
ENV['TZ'] = 'Europe/Berlin'
#=> "Europe/Berlin"
Time.parse 'Aug 04'
#=> 2014-08-04 00:00:00 +0200
format_time 'Aug 04'
#=> 2014-08-04 00:00:00 -0400
Time.parse 'Aug 04'
#=> 2014-08-04 00:00:00 +0200
Você pode modificar format_time
acima para tomar o fuso horário de destino como um argumento e até mesmo o código que deseja executar no fuso horário de destino como um bloco.