2008-11-26 19 views
2

我今天早些時候發佈了一個問題,當時我還沒有就此問題進行調查。我可以在這裏更簡潔。Ruby on Rails和Active Record獨立腳本不同意數據庫值:時間戳

我在Windows上使用MySQL運行RoR 2.1.2。 SQL服務器的本地時區是UTC。我的本地時區是太平洋(-0800)

我有一個模型:時間戳類型列,我可以做這樣的事情有:在

record = Record.find(:first) 
record.the_time = Time.now() 

當我做了「從記錄中選擇*」數據庫中顯示的時間比我的本地時間提前8小時,這是正確的,因爲數據庫在UTC。 (我已經通過一個簡單的'select now()'和'select utc_timestamp()'來驗證它'用utc'思考')。這就是麻煩開始的地方。如果我在一個視圖中顯示的時間:

<%= h record.the_time %> 

...然後我回到正確的時間,以UTC格式顯示。如果我在當地時間16點40分給數據庫寫信,數據庫顯示00:40:00。

但是,如果我運行一個獨立的腳本:

record = Record.find(:first) 
puts record.the_time 

...然後我回來,我存儲在數據庫中(0時40分〇〇秒)的UTC時間,但與當地時區:

Wed Nov 26 00:40:00 (-0800) 2008 

...八小時的時間扭曲。爲什麼存儲時間正確翻譯它,但檢索它不?如果我比較數據庫中最近一次存儲的時間並將其與當前時間進行比較,則當前時間較短 - 告訴我這不僅僅是一個字符串轉換問題。

任何想法?

回答

0

最後,它通過存儲倍的整數遠遠更容易做到這一點(Time.now()。to_i()),並將它們轉換回需要顯示它們的時間(Time.at(the_time_the_database_returned_to_me))。這不是最好的解決方案,但它是唯一能夠工作的解決方案。

0

那麼,你沒有評論我最後的建議重新啓動服務器或控制檯。

我有類似的問題,當我這樣做的時候它已經修復了。

另外你提到了一個獨立的腳本,但爲了獲得Rails的時區功能,代碼需要在Rails中運行。

1

config/environment.rb中有一個設置設置time_zone。也許這不是設置相同的腳本:

# Make Time.zone default to the specified zone, and make Active Record store time values 
# in the database in UTC, and return them converted to the specified local zone. 
# Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time. 
config.time_zone = 'UTC' 

您也可以嘗試明確指定TZ和格式:

require 'active_support/core_ext/date/conversions' 
record.the_time.utc.to_s(:db) 

(或作弊,並從那裏搶到的代碼片段,如果你不使用你的獨立腳本active_support)

1

嘗試要求active_support

相關問題