Ruby on Rails: Почему я записываю часовые пояса, когда записываю время в БД, а затем читаю его обратно? - PullRequest
1 голос
/ 26 ноября 2008

У меня config.time_zone в environment.rb, установленном в «UTC», и мой сервер MySQL возвращает текущее время в моем местном часовом поясе, когда я запускаю «select now ();»; и в utc, когда я спрашиваю "select utc_timestamp;"

Я использую rails 2.1.2, mysql gem 2.7.3, activerecord gem 2.1.2 и mysql --version возвращает "Ver 14.12 Distrib 5.0.27 для Win32 (ia32)".

РЕДАКТИРОВАТЬ: мой environment.rb установлен в UTC и был с тех пор, как я начал проект. Перезагрузка сервера не подобрала бы никаких изменений.

record = Record.find(:first)
puts Time.now
# Tue Nov 25 17:40:48 -0800 2008
record.time_column = Time.now
record.save

mysql> select * from records;
---------------------
 2008-11-26 01:40:48

#note that this is the same time, in UTC.

record = Record.find(:first)
puts record.time_column
Wed Nov 26 01:40:48 -0800 2008

#NOTE that this is eight hours in advance!  
#All I've done is store a date in the database and retrieve it again!

Есть идеи, что вызывает это?

Ответы [ 3 ]

5 голосов
/ 26 ноября 2008

У нас была та же проблема с датами, часовыми поясами и MySQL. Последний предполагает, что вы предоставляете ему значения даты / времени в часовом поясе, с которым он настроен.

Но, так как вы настроили Rails для обработки времени в UTC, ActiveRecord преобразует любые значения даты / времени в UTC (таким образом, вторник 25 ноября, 17:40:48 -0800 2008 становится ср. 26 ноября, 01:40:48 0000 2008) до используя значение в запросе обновления / создания SQL, который он генерирует и отправляет в MySQL.

В псевдокоде

("time = %t", Tue Nov 25 17:40:48 -0800 2008) => "time = '2008-11-26 01:40:48'

, который рассматривается как MySQL 2008-11-26 01:40:48 -0800 .

Посмотрите файл журнала отладки, и вы поймете, что я имею в виду. Единственный способ, которым он может работать должным образом (то есть без неприятных сюрпризов), - это установить один и тот же часовой пояс в Rails и MySQL, который является UTC. Это конфигурация, которую мы используем.

1 голос
/ 27 ноября 2008

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

Это возвращалось к rails 2.0, где реализация timezones / utc была невероятно глючной / сломанной, так что теперь может быть лучше.

0 голосов
/ 26 ноября 2008

После редактирования файла environment.rb вы перезагружали свой сервер перед тем, как сделать новую запись в вашей базе данных?

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