Смещение по часовой стрелке по умолчанию в Ruby, по-видимому, -0800. Я хочу установить минус -0500. Как это сделать?
Установить смещение часового пояса в Ruby
Ответ 1
Изменить часовой пояс на вашей ОС; Ruby заберет изменение.
Ответ 2
Задайте переменную окружения 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.
Ответ 3
обновленный ответ: используйте ActiveSupport
Более свежие версии модуля Rails ActiveSupport предлагают лучшее решение MUCH в модуле 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
Ответ 4
Чтобы программно установить временную зону рубина, также установите переменные среды из рубина, обратившись к хэшу ENV:
ENV['TZ'] = 'UTC'
Time.at 0
#=> 1970-01-01 00:00:00 +0000
Это помогает избежать необходимости изменять вашу ОС только для приложения и дает вам большую мобильность вашего приложения, если вы переместите его на другую машину. Если вы используете Rails, ActiveSupport:: TimeZone также предлагает некоторые функции, которые помогут с переопределением TimeZone.