2012-01-09 72 views
1

我有一個用戶模型和一個朋友模型..我試圖跟蹤用戶最後一次聯繫朋友的時間。我有收集這些信息,並保存它守護進程:Rails 3.1時區,完全難倒

friend.last_contact = Time.parse(status.created_at) #this is where I go wrong 
    friend.save 

我得到來自Twitter這個信息這是在UTC與像一個格式報告:當我進入軌道

"Thu Jan 05 23:29:00 +0000 2012" 

控制檯並執行這些命令,則日期將以UTC時間正確保存爲UTC。然而,當我通過一個守護進程收集這些信息時,它將它保存在數據庫中,但是使用UTC時間,這使得它可以在4小時內關閉..我使用rails runner來運行守護進程,所以我相信主動支持應該沒事。我不能爲我的生活找不出什麼錯誤..

從我的服務器導軌安慰一些輸出:

1.9.1 :001 > Time.now 
=> 2012-01-10 00:40:37 +0400 

1.9.1 :002 > Time.zone.now 
=> Mon, 09 Jan 2012 20:40:56 UTC +00:00 

這是一個時間戳時,被檢索19分鐘前的消息保存:

1.9.1 :009 > b.last_contact 
=> Tue, 10 Jan 2012 00:27:20 UTC +00:00 

你會發現,它的服務器的「Time.now」 ..但保存爲UTC ...什麼是搞亂了我是,如果我進入軌道控制檯和I型:

> friend.last_contact = Time.now ; friend.save 

> friend.last_contact = Time.zone.now ; friend.save 

我拿出正確的時間......知道的任何幫助。

+0

爲什麼'friend.last_contact = status.created_at'沒有工作? – Raphael 2012-01-09 20:53:41

+0

對不起,你在那裏看到的只是我的最後一次嘗試.. status.created_at結束與db中相同的不正確的utc值.. – Inc1982 2012-01-09 20:57:30

+0

我應該添加我也嘗試過:friend.last_contact = Time.now在守護進程中文件以及friend.last_contact = Time.zone.now,兩者都不起作用,同樣的誤導utc – Inc1982 2012-01-09 21:03:01

回答

0

我在這個同樣的問題上掙扎着,也從Twitter上也找到了(儘管這不是真正相關的)。

三個想法:

  1. 是你在UTC時間運行在你的後臺程序的服務器?時區在Rails 3中的工作方式是將時間轉換爲系統時區,保存(之前未更改)。所以它看起來不錯,直到你堅持價值。

  2. 是否有可能您的測試/生產數據庫不是UTC,但您的本地測試數據庫是?如果你在一個託管數據中心運行,有時候他們運行的數據庫不是UTC,而是在它們託管的任何時區。

  3. 是否有可能守護進程在具有不同TZ環境變量的用戶帳戶下運行(或不同的地區)? http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html

+0

服務器在格林威治標準時間+4格林威治標準時間..這是我錯了的偏移量..我thougt無關緊要,因爲它始終以UTC保存到DB中?我的服務器應該在UTC時間嗎? – Inc1982 2012-01-10 16:40:51

+0

是的,服務器將確定記錄保存時的時區偏移量。所以這是你的問題。您需要將服務器設置爲UTC,或者通過設置config.time_zone ='Moscow'來告訴Rails使用本地時間。順便說一句,你可以請「接受」我的答案,所以我得到信用? :-) – nateware 2012-01-10 19:44:30

+0

嘿,我想先嚐試一下,但現在我會接受它。如果不起作用,請發回。謝謝你! :) – Inc1982 2012-01-11 05:12:03