Как рассчитать смещение в часах указанного часового пояса от UTC в рубине? - PullRequest
25 голосов
/ 01 апреля 2012

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

1 Ответ

55 голосов
/ 01 апреля 2012

Да, используйте 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.

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

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