Установить смещение часового пояса в Ruby - PullRequest
21 голосов
/ 16 января 2011

Смещение часового пояса по умолчанию в Ruby, по-видимому, составляет -0800.Я хочу установить мой на -0500.Как мне это сделать?

Ответы [ 4 ]

32 голосов
/ 16 января 2011

Установить переменную среды TZ ...

$ ruby -e 'puts Time.now'
Sat Jan 15 20:49:10 -0800 2011
$ TZ=UTC ruby -e 'puts Time.now'
Sun Jan 16 04:49:20 +0000 2011

Ruby получает информацию о часовом поясе из операционной системы хоста.

Наиболее прямо он использует API библиотеки C, заданные C99 и Posix.

Реализация этого API зависит от системы, на моем Mac это означает, что он обращается к /etc/localtime, если нет переменной окружения TZ.

Примерно то же самое в Linux.

29 голосов
/ 02 февраля 2013

обновленный ответ: используйте 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
11 голосов
/ 13 января 2016

Чтобы программно установить часовой пояс ruby, также установите переменные среды из ruby, обратившись к хешу ENV:

ENV['TZ'] = 'UTC'
Time.at 0
#=> 1970-01-01 00:00:00 +0000

Это помогает избежать необходимости изменять вашу ОС только для приложения и дает вам больше переносимости вашего приложения, если вы перенесете его на другой компьютер. Если вы используете Rails, ActiveSupport :: TimeZone также предлагает некоторые функции, помогающие переопределить TimeZone.

6 голосов
/ 16 января 2011

Изменение часового пояса в вашей ОС;Руби получит сдачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...