2009-12-29 82 views
0

我在Rails 2.1+中實現了時區支持,並且我從數據庫中獲取數據的方式遇到了明顯的錯誤。讓我嘗試設置它。Rails的時區被忽略的ActiveRecord查找?

「交易」模型包含「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 

我得到正確的時間。有沒有搞錯???我只想說,我需要這個日期才能正常工作,但我無法弄清楚我的問題在哪裏。任何援助,你可以提供將不勝感激!

回答

1

請參閱我的prior rsponse關於AR日期查詢的Time vs Time.zone。

+0

啊,再次感謝您的幫助!我最終會得到這個...... :-) – 2009-12-29 19:59:37

0

而不是使用Time.now的,請嘗試使用Time.zone.now

當然,你必須設置這個和一切。 This tutorial似乎有幫助。

0

時間類不關心的#to_s實施的時區,因此你必須使用

Time.zone.now # or any other TimeWithZone object 
在你的發現者/ named_scopes /找到電話

。或者你可以通過閱讀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或成初始化。