Используя Rails и ActiveSupport, как я могу получить смещение часового пояса с учетом экономии времени?

У меня есть строка, представляющая дату и время. Например:

"2013-10-29T08:30:00"

у которого нет информации о часовом поясе, но я знаю, что он представляет время в определенном часовом поясе, например. «Центральное время (США и Канада)»

Я хочу создать правильный объект DateTime с правильной информацией о часовом поясе, но мне это не удается, потому что я не знаю, следует ли использовать «-06:00» или «-05:00» в качестве смещения (из-за перехода на летнее время). ).

Любая помощь?


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


Ответы (1)


Не беспокойтесь о переходе на летнее время :) ActiveSupport позаботится об этом за вас.

Time.zone = "Central Time (US & Canada)"

t = Time.zone.parse "2013-10-29T08:30:00"
#=> Tue, 29 Oct 2013 08:30:00 CDT -05:00

t.dst?
#=> true

Ссылка на настройку часового пояса и dst? http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html

Обновление: приведенный выше блок предназначен для демонстрации. В приложении вы можете установить часовой пояс на config/application.rb

config.time_zone = 'Central Time (US & Canada)'

Это установит значение по умолчанию Time.zone, поэтому вам больше не нужна первая строка приведенного выше кода.

person Billy Chan    schedule 29.10.2013
comment
ActiveRecord также должен хранить все в БД в формате UTC, поэтому преобразование в/из разных часовых поясов должно также быть тривиальным, если вы знаете, между какими часовыми поясами выполняется преобразование. - person jefflunt; 29.10.2013
comment
@jefflunt, спасибо за подсказку, я обновил ответ. Также я предполагаю, что запись времени OP не из ActiveRecord, к которой всегда подключено UTC. - person Billy Chan; 29.10.2013
comment
@BillyChan Спасибо за ответ. Итак, если я не хочу менять глобальный часовой пояс (Time.zone= xxxx), я полагаю, что я должен сначала сохранить его во временной переменной (например, temp = Time.zone), затем изменить его, затем разобрать, а затем вернуться к сохраненному часовой пояс. Это правильно? - person p.matsinopoulos; 29.10.2013
comment
@ p.matsinopoulos, это не обычное использование. Если вы установите temp = Time.zone и назначите часовой пояс temp, temp будет строкой, а расчет часового пояса все равно будет зависеть от предыдущего часового пояса. Так что сомневаюсь, что ваш метод сработает. Я думаю, хак будет работать непосредственно с Time.zone, а после завершения вернуться к глобальному. Однако, если возможно, я предлагаю вам преобразовать все данные о времени в формат UTC, чтобы добиться большей согласованности и гибкости. - person Billy Chan; 29.10.2013
comment
@BillyChan Я думаю, что мы на одной волне: 1) temp = Time.zone 2) Time.zone = "Central Time (US & Canada)" 3) t = Time.zone.parse "2013-10-29T08:30:00" 4) Time.zone = temp 5) return t - person p.matsinopoulos; 29.10.2013
comment
@p.matsinopoulos, да, это должно сработать, и мы имели в виду одно и то же :) - person Billy Chan; 29.10.2013