Мне нужно рассчитать смещение в часах определенного часового пояса от 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