1

Я относительно новичок в RoR, и у меня возникают проблемы с преобразованиями часового пояса. Когда вы получаете данные из базы данных (которая хранится в центральном времени США), она полагает, что время там есть в UTC и пытается их конвертировать, что делает их неправильными на 5 часов. У меня есть это в моем файле application.rb:Rails 3.1 Часовой пояс UTC и Центральный часового пояса

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

Если удалить eiher одну из этих директив конфигурации, время не сохраняет корректно. Пока я их использую, время хранится в базе данных правильно, но RoR не может их правильно прочитать. Чтобы исправить это, мне нужно преобразовать все время, которое я получаю из базы данных в UTC. Я должен верить, что есть лучший способ.

Я также попытался установить ENV ['TZ'], но это, казалось, ничего не делало.

ENV['TZ'] = "US/Central" 

Любая помощь будет воспринята.

Спасибо!

+0

Есть ли вероятность, что вы делаете * разумную * вещь и меняете данные в самой базе данных, так что это все UTC? Хранение данных в одном конкретном (не-UTC) часовом поясе требует неприятностей - и это также потеряет информацию из-за переходов DST. –

+0

К сожалению, дизайнерское решение из моих рук. Для этого проекта мне сказали, что время должно храниться в центральное время США. – user1485753

+0

Вы имеете в виду в Центральном времени, не так ли? Не CST, который всегда * стандартный * время. –

ответ

0

Для меня на самом деле, AR отклонил установленное значение для чего-то другого от: UTC /: местный

config.active_record.default_timezone = 'Central Time (US & Canada)' 

эта линия закончилась с журналом, наполненную предупреждения падения обратно: местный

То, что работало в полностью переключение системы часовой пояс

ENV['TZ'] = "US/Central" 

Убедитесь, что использовали правильное имя tz. имена Unix часовых поясов не те, что используются ActiveSupport :: TimeZone

См ActiveSupport :: TimeZone :: КАРТ для этого

Кроме того, обратите внимание, что после этого Time.now == Time.current; он будет давать время в определенном часовом поясе;

Так что это скорее своего рода взломать, чем решение.

Смежные вопросы