为什么在delayed_job中关闭时区?

jos*_*ine 5 ruby timezone ruby-on-rails delayed-job timezone-offset

在我的Rails应用程序中,当我使用delayed_job gem 创建后台作业时,我将所有时间偏移6小时.

我的理解是delayed_job使用你的时区,但它就像是使用了错误的时区.而不是距离UTC 6小时(CST是我的时区),这是-12小时!

这里有一些视图代码来说明.注意:

  • Time.now给出2014-03-04 23:26:55 -0600
  • Time.now.utc给出2014-03-05 05:26:55 UTC
  • 但delayed_job几秒前的想法是2014-03-04 17:26:53 -0600

我的看法:

#delayed_jobs/index.html.erb

<h1>All Background Jobs</h1>
<p>The time now is: <%= Time.now %> </p>
<p>The time UTC is: <%= Time.now.utc %> </p>
<table>
  <tr>
    <th>ID</th>
    <th>Queue</th>
    <th>Created At</th>
    <th>Run At</th>
  </tr>

<% @delayed_jobs.each do |dj| %>
  <tr>
    <td><%= dj.id %></td>
    <td><%= dj.queue %></td>
    <td><%= dj.created_at %></td>
    <td><%= dj.run_at %></td>
  </tr>
<% end %>
</table>
Run Code Online (Sandbox Code Playgroud)

输出: 索引视图的输出

我可以通过以下三种方式创建作业,并获得相同的created_at时间:

MyClass.delay.foo
MyClass.delay(run_at: 0.minutes.from_now).foo
MyClass.delay(run_at: 0.minutes.from_now.getutc).foo
Run Code Online (Sandbox Code Playgroud)

我的配置有:

#config/application.rb

config.time_zone = 'Central Time (US & Canada)'
config.active_record.default_timezone = 'Central Time (US & Canada)'
Run Code Online (Sandbox Code Playgroud)

jos*_*ine 3

正如 @rainkinz 所建议的,问题出在我的 config/application.rb 中,特别是第二行:

config.time_zone = 'Central Time (US & Canada)'
config.active_record.default_timezone = 'Central Time (US & Canada)'
Run Code Online (Sandbox Code Playgroud)

显然,default_timezone 设置在 Rails 3.2.13 之后已被弃用,我几天前刚刚升级了它。

当我将其更改为仅设置本地时区时:

config.time_zone = 'Central Time (US & Canada)'
#config.active_record.default_timezone = 'Central Time (US & Canada)'
Run Code Online (Sandbox Code Playgroud)

这解决了问题。所有活动记录对象在保存时似乎仍然具有正确的时间,延迟作业也是如此。