#mysql #ruby-on-rails #ruby #time
#mysql #ruby-on-rails #ruby #время
Вопрос:
У меня есть приложение Rails 3 на Ruby 1.9.2, в котором пользователи вводят рабочие часы, и они сохраняются в базе данных MySQL. Однако, когда пользователь делает это, введенное время «8:00 утра» сохраняется в базе данных как 3 часа дня. Я хочу, чтобы оно сохранялось в том виде, в каком они его ввели, независимо от часового пояса. Я подумал, что лучший способ сделать это — установить все в UTC и заставить его игнорировать мой часовой пояс (Аризона), но Rails, похоже, игнорирует мои настройки. Пример:
Time.zone = 'UTC'
mon_open_date = Time.parse(params[:venue][:mon_open_at]) rescue nil
# => 2011-04-27 08:00:00 -0700
Результат в MySQL:
-------------
| mon_open_at |
-------------
| 15:00:00 |
-------------
1 row in set (0.00 sec)
Есть идеи?
Ответ №1:
Time.parse всегда анализирует строку в соответствии с локальным часовым поясом вашего компьютера. Вам нужно использовать Time.zone.parse
, чтобы проанализировать его как указанный часовой пояс, UTC.
Ответ №2:
MySQL всегда использует настройку часового пояса сервера по умолчанию (хотя вы можете изменить это, если вы администратор базы данных).
Если вы сохраняете свои значения даты / времени в столбцах временных меток, они хранятся независимо от часового пояса (преобразуются в UTC для хранения, а затем снова возвращаются к часовому поясу сервера для использования).
Если вы сохраняете дату / время в столбце DATETIME, значения сохраняются точно так, как вы их вводите — если вы измените часовой пояс сервера, а затем выберете старые значения из столбца DATETIME, вы увидите точно такие же значения, как и при их вводе.
Ознакомьтесь с документацией по столбцам DATETIME / TIMESTAMP для уточнения деталей.