2012-12-05 54 views
1

我的服務器系統時區「歐洲/巴黎」如何強制一個時間UTC當服務器是在另一個時區

我配置我的Rails應用程序(Rails的3.29) config.time_zone =「歐洲/倫敦 config.active_record.default_timezone =:UTC

所有事件的開始/結束日期將存儲在數據庫爲: 「2013年1月2日10:00:00」

問題是作用域

scope :starting, lambda {|start_date_time| 
    {:conditions => ["starts_at = ?", Event.db_datetime(start_date_time)] } 
} 
... 
def self.db_datetime(date_time) 
    Time.at(date_time.to_i).utc.to_s(:db) 
end 

當我創建start_date_time過濾器, 我得到一個系統本地時區zdate日期時間 start_date_time = Time.new(2013,1,2,10,0,0) 2013-01-02 10:00:00 +0100

and Event.db_datetime(start_date_time) gives "2013-01-02 09:00:00" 
which cannot be found 

有一種方法強制UTC日期時間,以便: START_DATE_TIME = Time.new(2013年,1,2,10,0,0)會給 2013年1月2日10:00:00 UTC

感謝您的意見

回答

2

Time.at - 或Time.new - 解析系統本地時區中的時間,該時區顯示爲UTC + 1。 這就是在UTC + 1中解析10:00的原因在UTC中變爲09:00的原因。

我認爲你正在尋找的功能是

Time.zone.at        #equivalent to Time.at 
Time.zone.local(2013, 1, 2, 10, 0, 0) #equivalent to Time.new 

將分析在時間段由

config.time_zone = 'Europe/London' 

這樣做的結果定義的給定日期和時間是TimeWithZone對象,這是一個Rails擴展到ruby 時間

有關TimeWithZone的更多信息,請查看此文檔頁面http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html

你可以這樣使用它;在db_datetime(DATE_TIME)方法是不是真的有必要了:

# class Event 
scope :starting, lambda {|start_date_time| 
    {:conditions => ["starts_at = ?", start_date_time.to_s(:db)] } 
} 
# I think to_s(:db) already handle the .utc conversion part 



## example 
start_date_time = Time.zone.local(2013, 1, 2, 10, 0, 0) 
Event.starting(start_date_time) 
+0

謝謝你說的沒錯所以一旦我的日期的存儲,我可以在日期或時間搜索(小時:分鐘)。我強制過濾器(日期時間)到使用UTC : 高清self.db_datetime(DATE_TIME) Time.use_zone Rails.configuration.time_zone做 Time.zone.local(date_time.year,date_time.month,date_time.day,date_time.hour, date_time.min,0).to_s(:db) end end – erwin

+0

Time.zone已經使用了Rails配置中定義的time_zone,所以你不需要重新定義它。您可以直接使用Time.zone.local,也可以使用Time.zone.at(date_time.to_i)。 – AdrienK

+0

我在我的anwser – AdrienK

相關問題