Как в Rails или вообще в Ruby узнать, соответствует ли строка даты и времени дате и времени с переходом на летнее время или нет?

Мое приложение работает в часовом поясе "Афины" (Греция). Стандартное смещение "+02:00". Однако летом в Афинах действует летнее время, что означает, что смещение становится «+03:00» для определенных периодов в году. И эти периоды не являются стандартными. Они меняются.

Учитывая строку «20YY-MM-DDTHH:MI:SS», которая представляет дату и время в часовом поясе «Афины», я хочу иметь возможность преобразовать ее в правильный экземпляр DateTime, используя либо «+02:00», либо «+ Смещение 03:00".

Следовательно, например, строка «2013-04-11T20:28:07» на самом деле «2013-04-11T20:28:07+03:00», тогда как строка «2013-11-11T20:28:07» на самом деле "2013-11-11T20:28:07+02:00".

Есть ли у меня какой-либо код Rails/Ruby, который может помочь мне узнать правильное смещение, учитывая часовой пояс и спецификацию даты и времени, в которой отсутствует фактическое смещение?


person p.matsinopoulos    schedule 01.11.2013    source источник


Ответы (4)


Кажется, это работает:

Time.parse('2013-04-11T20:28:07').in_time_zone('Athens').utc_offset
#=> 10800

Time.parse('2013-11-11T20:28:07').in_time_zone('Athens').utc_offset
#=> 7200
person Stefan    schedule 01.11.2013
comment
Без рельсов вам нужен require 'active_support/core_ext/time/zones' require 'time' для выполнения кода. - person knut; 01.11.2013

Я думаю, вам нужна библиотека TZInfo (здесь). Библиотека использует имя часового пояса, указанное в базе данных IANA TimeZone. Эта база данных содержит правила, определяющие смещения для каждого часового пояса, указанного по имени. База данных регулярно обновляется при изменении правила.

Использование простого смещения часового пояса для определения часового пояса недостаточно. Смещения можно изменить, просто приняв закон, изменяющий смещение базовой линии, дату или даже время перехода с летнего времени на зимнее. Москва, например, меняла часовые пояса как минимум дважды за последние 4 года.

Лучшим решением, если вы используете Rails, является использование in_time_zone, как отмечает Стефан.

person Panagiotis Kanavos    schedule 01.11.2013

http://www.ruby-doc.org/core-1.9.3/Time.html

летнее время? → true или false Возвращает значение true, если время соответствует летнему времени в соответствующем часовом поясе.

Итак, если вы делаете Time.local(YYYY, M, D).dst?
и это дает true, тогда время этой строки DateTime упало на летнее время..

person thunder    schedule 01.11.2013
comment
Спасибо за ответ. Хорошая информация. Я считаю, что мне нужно добавить час, минуты, секунды при вызове в Time.local, чтобы получить более точный ответ. Но ваш ответ полезен для меня. - person p.matsinopoulos; 01.11.2013
comment
Вы правы... В дни, когда время изменяется, результат зависит от дополнительной информации о часах/минутах/секундах. - person thunder; 01.11.2013