为ActiveRecord查找忽略Rails时区?

时间:2009-12-29 16:16:57

标签: ruby-on-rails activerecord timezone

我正在Rails 2.1+中实现Timezone支持,并且我遇到了从数据库中提取数据的明显错误。让我尝试设置它。

“deals”模型包含“offer_date”日期时间字段。假设我有两条带有这些offer_dates的记录:

Deal 1: 2009-12-29 23:59:59 -0500
Deal 2: 2009-12-28 23:59:59 -0500

这是正确的:日期应标记其给定日期的最后一秒。

现在,到了今天找到交易的时候,我有以下AR查询:

@deal = Deal.first(:conditions=>['offer_date > ?', Time.now.beginning_of_day], :order=>"offer_date ASC")

在这种情况下,虽然它是今天的第29位,但它表面上是第28位。为什么?这是控制台中发生的事情:

>> @deal = Deal.first(:conditions=>['offer_date > ?', Time.now.beginning_of_day], :order=>"offer_date ASC")
=> #<Deal id: 2, <blah blah blah...>, offer_date: "2009-12-29 04:59:00">

它将时间向前移动了5个小时,将昨天的时间转移到下一个时间。但是当我这样做时:

>> @deal.offer_date
=> Mon, 28 Dec 2009 23:59:00 EST -05:00

我得到了合适的时间。有没有搞错???我只想说,我需要那个日期才能正常工作,但我无法弄清楚我的问题在哪里。非常感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:1)

有关AR日期查询,请参阅我的prior rsponse时间与时间。区域。

答案 1 :(得分:0)

请尝试使用Time.now

,而不是使用Time.zone.now

当然你必须设置这个和一切。 This tutorial似乎很有帮助。

答案 2 :(得分:0)

时间类并不关心 #to_s 实施的时区,因此您必须使用

Time.zone.now # or any other TimeWithZone object

在你的finders / named_scopes / find中。或者您可以通读http://marklunds.com/articles/one/402然后再点击

module ActiveRecord
  module ConnectionAdapters # :nodoc:
    module Quoting
      # Convert dates and times to UTC so that the following two will be equivalent:
      # Event.all(:conditions => ["start_time > ?", Time.zone.now])
      # Event.all(:conditions => ["start_time > ?", Time.now])
      def quoted_date(value)
        value.respond_to?(:utc) ? value.utc.to_s(:db) : value.to_s(:db)
      end
    end
  end
end

进入您的environment.rb或初始化程序。