2016-02-02 36 views
1

我注意到在我的日誌中使用Date.today方法的當前時間非常奇怪的問題。基本上,我有一個每天晚上在00:00運行的cron作業(使用發條),以檢查哪些訂閱到期,以便它嘗試自動更新它們。該作業執行一個方法,該方法依次執行查詢,如下所示:Date.today對應於實際日期

where("date(active_until) <= ?", Date.today) 

大多數情況下,這會正確執行。然而,從我的日誌觀察,似乎有些時候Date.today不符合實際日期。從我的日誌中刪除:

注意:這些日期是未來的,因爲我手動設置時間來測試它是否正確執行。

D, [2016-05-01T00:00:00.015901 #21699] DEBUG -- : Subscription Load (2.6ms) SELECT "subscriptions".* FROM "subscriptions" WHERE date(active_until) <= '2016-04-30' 

D, [2016-05-02T00:00:00.011130 #21721] DEBUG -- : Subscription Load (2.2ms) SELECT "subscriptions".* FROM "subscriptions" WHERE date(active_until) <= '2016-05-02' 

如果你看一下第一種情況下,你會看到該聲明是在2016-05-01T00:00:00.015901執行,而Date.today生產2016-04-30。第二種情況顯然是正確的,因爲日誌日期對應於Date.today。

最大的問題是我無法重現它。我從我的日誌中看到的唯一事情是它發生了24次中的3次。這裏有什麼問題? Rails是否有可能將輸入參數緩存到查詢中?

我的紅寶石版本是:紅寶石2.2.1p85(2015年2月26日修訂49769)x86_64的Linux的]

我的Rails的版本是:4.2.1

+6

你試過'Time.zone.today'嗎?這看起來像是一個時區問題。 – Leito

+0

如果確實是一個時區問題,那爲什麼我們沒有一致地看到這種行爲? – tomor

+1

那麼,如果你的時區的偏移量是-5(來自UTC),只要你介於:午夜和晚上7點之間,你就會好起來的,因爲今天會匹配。 – Leito

回答

0

確保您的config/application.rb文件您timee區設置爲你正在測試的實際時區:

對於PST我們使用:

config.time_zone = 'Pacific Time (US & Canada)'

要獲得區字符串由軌道可用列表運行此命令:

rake time:zones:all

你也可以給它一個更具體的語言環境。對於美國:

rake time:zones:us

+0

時區設置正確,正如我在之前的評論中所說的,如果這是一個時區問題,則行爲將保持一致(意味着每次在午夜我們都會看到不匹配)。在這種情況下,在23次中,4次我們在同一時間看到日期不匹配。 – tomor

+0

好的。你可以嘗試使用'<= Date.today。end_of_day'。如果您正在使用'1.month.from_now'這樣的設置來設置訂閱的結束時間,那麼從現在開始的1個小時就到了。 –

-1

由於這種情況在午夜我相信這是在日誌文件生成已執行條目的腳本後小幅更新時間問題。 由於日誌記錄工具與發送日誌條目的腳本是分開的,因此可能與負載相關。

相關問題