Crie um horário em um fuso horário específico em Ruby

Você já quis usar Ruby puro para obter uma Timeinstâ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 TZvariá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_timeacima 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.