2013-02-09 21 views
1

我遇到問題,在rails中執行查詢會轉換生成的postgres sql語句中的錯誤時間。 在shell,ruby和postgres中的時間是23:32,但在生成的sql語句中它是22:32與postgres準備聲明中的rails時間相差1小時

任何想法什麼是錯的?我使用的軌道3.2.11,皮克寶石0.14.1(帶包安裝安裝)

的Debian系統時間:

$ date 
Sat Feb 9 23:32:10 CET 2013 

在紅寶石:

1.9.2p290 :004 > Time.now 
=> 2013-02-09 23:32:15 +0100 

在Postgres的:

=> select current_time; 
    timetz  
-------------------- 
23:32:24.213487+01 
(1 row) 

生成rails查詢:

1.9.2p290 :003 > Item.where "next_crawling_at < ?", Time.now 
Item Load (1.1ms) SELECT "items".* FROM "items" WHERE (next_crawling_at < '2013-02-09 22:32:17.935595') 
+0

[此相關答案可能有幫助。](http://stackoverflow.com/questions/9571392/ignoring-timezones-altogether-in-rails-and-postgresql/9576170#9576170) – 2013-02-09 23:08:31

+0

是幫助,謝謝 – agreif 2013-02-10 07:50:14

+0

可能的重複http://stackoverflow.com/questions/9571392/ignoring-timezones-altogether-in-rails-and-postgresql/ – 2013-04-19 02:29:19

回答

1

看起來您已經在您的客戶端設置了UTC時區 - 儘管這似乎與您的Time.now的結果相矛盾。你會得到什麼Time.zone

沒有額外的夏令時DST偏移量(因爲我們現在有冬季了),您的時區可能是CET(中歐時間),而Time.now似乎被翻譯成UTC。

您可以強制使用Time.now.in_time_zone("Europe/Paris")的Ruby中的特定時區 - (或者任何時區名稱適合數據庫的時區設置)。

或者你可以強制使用UTC時間戳Time.now.utc並在Postgres中追加AT TIME ZONE 'Europe/Berlin'

或者您在任何地方都可以使用timestamp with time zone

+0

感謝您的解釋。 Time.zone結果: 加載生產環境(滑軌3.2.11) 1.9.2p290:001> Time.zone =>(GMT + 00:00)UTC – agreif 2013-02-10 07:33:44

+0

@agreif:解釋它,不是嗎? – 2013-02-10 07:44:19

+0

現在的問題是,我的rails應用程序可以自己設置datetime值(我可以提供時區信息),但rails還會自動維護created_at/updated_at列,這是在rails框架中完成的,所以我不能影響它。有沒有辦法在rails中全局設置它,以便我可以簡單地使用bla_time = Time.now; model.save! – agreif 2013-02-10 07:59:12