在范围内使用时,时间真的很奇怪

时间:2013-11-20 03:08:50

标签: ruby-on-rails date heroku

我的Rails-app中有一个页面应该显示游览,以便start_date字段等于明天的日期(GMT + 00)

我在application.rb中使用默认时区

# Set Time.zone default to the specified zone and make Active Record ...
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'

但是存在问题。我会看到今天甚至昨天的日期,而不是从明天开始显示旅行日期的页面。

我在页面上提供了以下信息:

Time.zone                (GMT+00:00) UTC
Date.today_local_zone    2013-11-20
Date.today               2013-11-20
Time.now                 2013-11-20 00:48:21 +0000

我的控制器中的代码:

puts "... #{ Tour.upcoming.order('start_date ASC').to_sql }"
@tours = Tour.upcoming.order('start_date ASC')

游览模型中的范围

class Tour < ActiveRecord::Base 
  attr_accessible :start_date, :title
  scope :upcoming, where('tours.start_date > ?', Date.today_local_zone)
end

简要介绍我的today_local_zone方法:

class Date
  def self.today_local_zone
    Time.zone.now.to_date
  end
end

以下是我的日志中的一行(查询日期与日志中的日期不同)

2013-11-20T00:48:21.178380+00:00 app[web.1]: ... SELECT "tours".* FROM "tours"  WHERE (tours.start_date > '2013-11-19') ORDER BY start_date ASC 
  • heroku restart之后或部署日期更加正确
  • 在heroku控制台heroku run rails c中,所有日期都是正确的
  • 我决定从头开始另一个应用程序并部署在heroku上。结果保持不变。
  • 我用pingdom每隔5分钟ping这个页面。午夜后一两个月甚至23个月后日期变得正确。即滞后值每天都不同。

UPD:

我尝试记录Time.zone.now.to_s.to_date的值。它的价值是正确的。

请同时查看my gist

  • 的Gemfile
  • 网页的屏幕截图,包括生成的查询的所有值和文本

1 个答案:

答案 0 :(得分:1)

我在第一次审核时错过了这个。问题出在您的范围声明中:

scope :upcoming, where('tours.start_date > ?', Date.today_local_zone)

这个定义是错误的。它在加载类时加载Date.today_local_zone。你需要把它包装在Proc中。所以它应该是:

scope :upcoming, lambda { where('tours.start_date > ?', Date.today_local_zone) }

确保每次使用范围时都执行Date.today_local_zone。