обновленный ответ: используйте ActiveSupport
Более поздние выпуски модуля ActiveSupport в Rails предлагают НАМНОГО лучшее решение в модуле active_support / time.(Обратите внимание, что модули в ActiveSupport можно загружать без перетаскивания во всех Rails ...)
Я рекомендую этот подход, поскольку он не требует установки какого-либо глобального состояния (например, установка часового пояса в вашей ОС или изменениеENV['TZ']
), которые могут иметь неожиданные побочные эффекты в других местах.Вот как вы его используете:
>> require 'active_support/time'
=> true
>> Time.at(1000000000).in_time_zone('US/Eastern')
=> Sat, 08 Sep 2001 21:46:40 EDT -04:00
>> Time.at(1000000000).in_time_zone('US/Pacific')
=> Sat, 08 Sep 2001 18:46:40 PDT -07:00
PS: если вы хотите увидеть все поддерживаемые имена часовых поясов, вы можете обратиться к:
>> ActiveSupport::TimeZone::MAPPING
=> => {"International Date Line West"=>"Pacific/Midway", "Midway Island"=>"Pacific/Midway", ...}
(оригинальный ответ - сейчасустарел)
Немного опоздал на вечеринку, но обнаружил, что мне нужно было установить часовой пояс на разные значения в соответствии с пользовательскими данными.
Раньше я делал (но см. Обновление ниже):
def with_time_zone(tz_name)
prev_tz = ENV['TZ']
ENV['TZ'] = tz_name
yield
ensure
ENV['TZ'] = prev_tz
end
, который допускает такие вещи, как:
>> with_time_zone('US/Eastern') { puts Time.at(1000000000) }
2001-09-08 21:46:40 -0400
>> with_time_zone('US/Pacific') { puts Time.at(1000000000) }
2001-09-08 18:46:40 -0700