Подтвердить что ты не робот

Как рассчитать смещение в часах определенного часового пояса от UTC в рубине?

Мне нужно рассчитать смещение в часах определенного часового пояса от UTC в Ruby. Эта строка кода работала для меня, или я подумал:

offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_offset).to_f / 3600.0

Но, оказывается, возвращалось мне стандартное смещение, а не смещение DST. Например, предположим

self.timezone = "America/New_York"

Если я запустил вышеприведенную строку, offset_in_hours = -5, а не -4, как следует, учитывая, что дата сегодня - 1 апреля 2012 г.

Может кто-нибудь посоветует мне, как вычислять offset_in_hours из UTC, учитывая действительную строку TimeZone в Ruby, которая учитывает как стандартное время, так и дневную экономию?

Спасибо!


Обновление

Вот несколько результатов от IRB. Обратите внимание, что в Нью-Йорке на 4 часа меньше UTC, а не 5, из-за летнего сбережения:

>> require 'tzinfo'
=> false
>> timezone = "America/New_York"
=> "America/New_York"
>> offset_in_hours = TZInfo::Timezone.get(timezone).current_period.utc_offset / (60*60)
=> -5
>> 

Это говорит о том, что в TZInfo есть ошибка, или это не dst-aware


Обновление 2

В комментариях joelparkerhender ошибка в приведенном выше коде заключается в том, что я использовал utc_offset, а не utc_total_offset.

Таким образом, по моему первоначальному вопросу правильная строка кода:

offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_total_offset).to_f / 3600.0
4b9b3361

Ответ 1

Да, используйте TZInfo следующим образом:

require 'tzinfo'
tz = TZInfo::Timezone.get('America/Los_Angeles')

Чтобы получить текущий период:

current = tz.current_period

Чтобы узнать, включено ли летнее время:

current.dst?
#=> true

Чтобы получить базовое смещение часового пояса от UTC в секундах:

current.utc_offset
#=> -28800 which is -8 hours; this does NOT include daylight savings

Чтобы компенсировать переход на летнее время со стандартного времени:

current.std_offset
#=> 3600 which is 1 hour; this is because right now we're in daylight savings

Чтобы получить общее смещение от UTC:

current.utc_total_offset
#=> -25200 which is -7 hours

Общее смещение от UTC равно utc_offset + std_offset.

Это смещение от локального времени, в котором действует летнее сбережение, в секундах.