0

我試圖讓我的所有模型都使用EST時區在同時配置爲EST的DB2數據庫中編寫時間戳。ActiveRecord默認時區無法從數據庫回讀

我已經配置了我的application.rb配置有以下幾點:

config.time_zone = 'Eastern Time (US & Canada)' 
config.active_record.default_timezone = 'Eastern Time (US & Canada)' 

當我創建一個新的記錄,並保存到數據庫中的時間戳看起來不錯:

=> #<TZTestModel id: 3500, added_ts: nil, ...> 
irb(main):002:0> rec.added_ts = Time.zone.now 
=> Fri, 06 Nov 2015 19:03:42 EST -05:00 
irb(main):003:0> rec.added_ts 
=> Fri, 06 Nov 2015 19:03:42 EST -05:00 
irb(main):004:0> rec.save 
SQL (91.0ms) INSERT INTO TZTESTMODEL(id, added_ts, ...) VALUES (3500, '2015-11-06 19:06:55.237000', ...) 
=> true 

我查詢數據庫和我可以看到插入了正確時間戳的記錄。但是,當我嘗試讀取記錄背透的ActiveRecord,時間戳字段是零:

irb(main):008:0> TZTestModel.first 
=> #<TZTestModel id: 3500, added_ts: nil, ...> 

這隻有當我在application.rb設置默認的時區發生。如果我不添加配置,則AR默認爲UTC,並且可以根本不寫入和讀取時間戳字段。

請任何建議,非常感謝。

回答

0

我終於找到了答案。問題是在RoR下運行時,config.active_record.default_timezone只接受兩個值/符號::utc:local。 我將該值設置爲:local,它完美地提取了時區。 在application.rb完整配置,現在是:

config.time_zone = 'Eastern Time (US & Canada)' 
config.active_record.default_timezone = :local 

當時間戳被添加到模型的對象,模型仍然存儲在UTC的價值,但它寫入數據庫,並在之前,自動轉換爲EST讀取(例如在輸出爲字符串之前)。

我也有一個我的應用程序,這是一個用Ruby編寫的守護進程(不是RoR)。在這個守護進程中,我直接將AR默認時間戳設置爲EST,而不是:local,並且還將ENV ['TZ']的值設置爲'EST',以確保在AR之外完成的任何日期/時間操作也使用正確的時區,像這樣:

ActiveRecord::Base.default_timezone = 'Eastern Time (US & Canada)' 
ENV['TZ'] = 'EST' 

這使得我的應用程序(RoR應用程序和Ruby守護程序)兩側的時區是一致的。