Ruby on Rails, delayed_job сериализует неправильную дату и время как GMT - PullRequest
0 голосов
/ 15 августа 2011

У меня есть код, который, кажется, выполняется неправильно, когда он сериализован и выполняется с delayed_job. Чтобы избавиться от необходимости, я использую Ubuntu 11.04, Ruby 1.8.7 с Rails 3.0.4.

В одной из моих таблиц есть поле даты и времени, в котором, очевидно, хранятся дата и время определенного события. В моем приложении RoR я использую это поле через приложение, вызывающее strftime для его форматирования различными способами. Вывод этого форматирования правильный на веб-странице.

Я также использую delayed_job, чтобы поместить это же поле в электронное письмо, которое отправляется (инициируется каким-либо действием). Когда приходит электронное письмо, кажется, что оно как-то отформатировано как GMT. Например, если в базе данных дата должна была быть 11-12-2011 15:30:00 (15:30 PM), сообщение электронной почты будет иметь вид 11-12-2011 22:30:00 (22:30). ).

Я заглянул в базу данных и нашел кое-что интересное:

  • Дата и время в базе данных 2011-11-12 22:30:00
  • Приложение, отображаемое через Интернет, правильно форматирует данные как 11-12-2011, 15:30
  • В электронном письме данные корректно форматируются как 11-12-2011, 22:30
  • Когда я запускаю небольшой файл ruby, который просто печатает дату и время

    p Time.now

Я получаю правильный вывод (местное, не по Гринвичу)

Mon Aug 15 10:15:27 -0600 2011

Когда я смотрю, что в сериализованном yaml для таблицы delayed_jobs, я вижу, что поле даты отформатировано как

2011-11-12 22:30:00 Z

В моем application.rb у меня есть

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

и в моем окружении .rb у меня есть

timezone = "Mountain Time (US & Canada)"

Может ли кто-нибудь помочь мне понять, что здесь происходит? Я относительно новичок в RoR, так что это может быть очень очевидный, легкий вопрос. Если вам нужна дополнительная отладочная информация, пожалуйста, дайте мне знать, и я могу опубликовать ее. Точно так же, если мой вопрос неясен, я могу попытаться уточнить

Ответы [ 3 ]

2 голосов
/ 13 октября 2011

В моем случае я решил явно указать метод in_time_zone в примере представления: @my_obj.created_at.in_time_zone.

Я знаю, что это не элегантно, но до сих пор я не нашел лучших решений.

1 голос
/ 26 августа 2011

Попробуйте изменить объект даты на строку перед сериализацией.

0 голосов
/ 16 августа 2011

Возможно, вы захотите установить часовой пояс в базе данных.Если это MySQL, см .: http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

...