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