Автономные скрипты Ruby on Rails и Active Record не согласуются со значениями базы данных для: временных меток - PullRequest
2 голосов
/ 26 ноября 2008

Я отправил вопрос ранее сегодня, когда я до сих пор не сосредоточился на этой проблеме. Я смогу быть более кратким здесь.

Я использую RoR 2.1.2 в Windows с MySQL. Часовой пояс сервера SQL - UTC. Мой местный часовой пояс Тихоокеанский (-0800)

У меня есть модель со столбцом типа timestamp, с помощью которого я могу делать такие вещи:

record = Record.find(:first)
record.the_time = Time.now()

Когда я делаю «выбор * из записей» в базе данных, показанное время на восемь часов опережает мое местное время, что является правильным, учитывая, что база данных находится в UTC. (Я проверил, что это «мышление в utc» с простыми «select now ()» и «select utc_timestamp ()»)

Вот тут и начинается беда. Если я отображаю время в представлении:

<%= h record.the_time %>

... тогда я получаю правильное время, отображаемое в формате UTC. Если я написал в базу данных в 16:40:00 по местному времени, база данных показала 00: 40: 00.

ОДНАКО, если я запускаю автономный скрипт:

record = Record.find(:first)
puts record.the_time

... затем я возвращаю время UTC, которое я сохранил в базе данных (00:40:00,), но с местным часовым поясом:

Wed Nov 26 00:40:00 (-0800) 2008

... восьмичасовая деформация времени. Почему сохранение времени правильно переводит, а восстановление - нет? Если я сравниваю сохраненное время из недавнего прошлого в БД и сравниваю его с текущим временем, текущее время становится меньше - говорит мне, что это не просто проблема преобразования строк.

Есть идеи?

Ответы [ 4 ]

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

В config / environment.rb есть настройка, которая устанавливает часовой пояс. Возможно, это не установлено в вашем скрипте:

# Make Time.zone default to the specified zone, and make Active Record store time values
# in the database in UTC, and return them converted to the specified local zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time.
config.time_zone = 'UTC'

Вы также можете попробовать явно указать TZ и формат:

require 'active_support/core_ext/date/conversions'
record.the_time.utc.to_s(:db) 

(или обмануть и взять фрагмент кода оттуда, если вы не используете active_support в своем автономном скрипте)

1 голос
/ 02 декабря 2008

Попробуйте потребовать active_support

0 голосов
/ 24 марта 2009

В конце концов, это было гораздо проще сделать, сохранив времена в виде целого числа (Time.now (). To_i ()) и преобразовав их обратно во время, когда мне нужно было их отобразить (Time.at (the_time_the_database_returned_to_me) ).) Это едва ли не лучшее решение, но это было единственное, что сработало.

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

Ну, вы не прокомментировали мое последнее предложение перезагрузить ваш сервер или консоль.

У меня была похожая проблема, и она была исправлена, когда я это сделал.

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

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