2012-11-30 33 views
0

我的服務器默認時區是+0400(莫斯科)。所有實例以UTC格式記錄到數據庫。 IE:用戶在04-00創建項目,記錄爲00-00。當我試圖獲得導軌中的時間偏移

Item.last 

我看到UTC原始時間。當我問:

Item.last.created_at 

我已經得到了+0400次。但!當我使用像

Item.where('created_at > ?', Time.now.beginning_of_day) 

STD時間的函數,它正在SQL查詢的

SELECT `items`.* FROM `items` WHERE (items.created_at > '2012-11-30 00:00:00') 

代替

SELECT `items`.* FROM `items` WHERE (items.created_at > '2012-11-29 20:00:00') 

所以我失去了4小時。小緊縮使用in_time_zone:

Time.now.beginning_of_day.in_time_zone(-4) 

但我不是絕地的方式:D任何想法?

+0

出於興趣開始一天,你怎麼樣「記錄到UTC格式的數據庫「?這是自動處理的,還是你必須明確這麼做? –

+1

@JonSkeet Rails(實際上是它的組件ActiveRecord)自動處理它。 – jdoe

+0

好的。如果你在'Time.now'後面搜索值,會發生什麼?這個*還*會在4小時內(與插入一致)或不符合(與上述查詢一致)?我想知道它是否「聰明」,並決定如果你從午夜開始尋找東西,那你的意思是午夜UTC而不是本地時間...... –

回答

0

我想我已經解決了這個問題:

Time.now.beginning_of_day.in_time_zone('UTC') 
=> Thu, 29 Nov 2012 20:00:00 UTC +00:00 

因此,這是關係什麼時間在莫斯科時UTC時區 :)

1

我希望您的用戶在他們的個人資料中有一些與他們的時區相關的設置。在這種情況下,您可以執行以下操作:

Time.use_zone(zone_of_current_user) do # like 'America/New_York' 
    @products = Product.where('created_at > ?', Time.zone.now.beginning_of_day) 
end 

這樣您就可以設置塊的區域。

注意使用zone方法Time

+0

我認爲沒有。對於純代碼來說,這是個好主意。但是,我需要它在範圍內 –

+0

@AlexanderBochkarev你可以在'around_filter'中調用'use_zone'(ApplicationController似乎是個好地方)。這樣,您的任何操作都將在用戶的時區中運行。 – jdoe