2014-10-04 58 views
0

我有一個Rails 4應用程序,根據最佳實踐是將日期存儲在我的MySQL數據庫中的UTC。還行吧。Rails 4忽略UTC轉換到MySQL數據庫

但是,我有一個方案無法正常工作。

我有一個事件管理器,它總是在尋找新的事件(存儲在數據庫中)來運行。這些事件根據用戶在網站上的操作存儲在數據庫中。 DB中的事件表有一個execution_date字段,用於存儲事件計劃執行日期。據此,當用戶執行某些創建事件事件時,execution_date將轉換爲UTC。

在Rails中,我使用了Time.now --> 2014-10-04T01:02:10-07:00(我從UTC開始7小時)。在DB這一次轉換爲UTC,所以我看到2014-10-04 08:02:10。我認爲這也是對的。

但問題是事件管理器運行一個查詢得到的事件等待執行的:

SELECT e.* 
           FROM events e, event_states es 
           WHERE e.execution_date <= NOW() 
           AND es.name = 'Pending' 
           AND es.id = e.event_state_id 

當我運行此查詢,NOW()返回我的本地時間是2014年10月4日01 :02:25。所以,現在應該執行的事件將在7個小時內執行。

因此,作爲總結,execution_date應始終存儲在服務器本地時間。

+0

你可以配置你的數據庫[使用UTC時間](http://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc)? – mccannf 2014-10-04 09:07:11

+0

謝謝mccannf。我最後用UTC_TIMESTAMP()替換了查詢中的NOW()函數,這與您的建議具有相同的效果。 – Rober 2014-10-04 09:35:33

回答

1

根據上述@mccannf評論,我didn't更新我的DB UTC時間,但我代替我的查詢與

SELECT e.* 
           FROM events e, event_states es 
           WHERE e.execution_date <= UTC_TIMESTAMP() 
           AND es.name = 'Pending' 
           AND es.id = e.event_state_id 

注:使用UTC_TIMESTAMP()獲取UTC時間。