【问题标题】:Rails timezone ignored for ActiveRecord find?为 ActiveRecord 查找忽略 Rails 时区?
【发布时间】:2009-12-29 16:16:57
【问题描述】:

我在 Rails 2.1+ 中实现时区支持,并且在从数据库中提取数据的方式中遇到了一个明显的错误。让我试着设置一下。

“交易”模型包含“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

我得到了正确的时间。有没有搞错???我只想说,我需要那个日期才能正常工作,但我不知道我的问题出在哪里。您能提供的任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails activerecord timezone


    【解决方案1】:

    有关 AR 日期查询,请参阅我的 prior rsponse Time vs Time.zone。

    【讨论】:

    • 啊,再次感谢您的帮助!我最终会得到这个...... :-)
    【解决方案2】:

    不要使用Time.now,而是尝试使用Time.zone.now

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

    【讨论】:

      【解决方案3】:

      Time类在#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 或初始化器中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        相关资源
        最近更新 更多