2012-01-04 78 views
0

我有一個課程模型,它具有日期時間屬性。如果我從數據庫中看到它,我會得到一次,如果我從對象看它,我會得到不同的日期&時間。ActiveRecord日期時間字段不匹配對象

>> Course.last.attribute_for_inspect :datetime 
=> "\"2012-01-04 01:00:00\"" 
>> Course.last.datetime 
=> Tue, 03 Jan 2012 19:00:00 CST -06:00 

有誰知道爲什麼這個值是不同的,我能做些什麼來解決它? Course.last.datetime的時間是正確的,但由於混淆,我在課程表上的查詢無法正常工作。

+0

您的數據庫以UTC格式存儲沒有偏移的內容。但是,當你查詢時,Rails應該自動爲你轉換。你可以發佈你正在使用的破解查詢之一的代碼嗎? – 2012-01-04 20:28:37

+0

http://railscasts.com/episodes/106-time-zones-in-rails-2-1 – clyfe 2012-01-04 20:33:30

+0

「application.rb」中'config.time_zone'的值是什麼,假如它沒有被評論? – maprihoda 2012-01-04 20:33:54

回答

2

fine manual

attribute_for_inspect(attr_name)
返回一個#inspect樣串該屬性attr_name的值。
[...]
日期和時間屬性以:db格式返回。

因此,當attribute_for_inspect用於日期時間時,它將返回數據庫用於該值的字符串。 Rails將時間存儲在數據庫中的UTC,任何明智的數據庫將使用ISO 8601來進行時間戳的格式化。

2012-01-04 01:00:00是ISO 8601格式的UTC時間戳。當Rails返回日期時間時,它會將其轉換爲ActiveSupport::TimeWithZone實例,幷包含基於您在application.rb中配置的時區的時區調整。您使用的是CST時區,這比UTC晚六個小時;從01:00減去6個小時會給你19:00,你會從午夜過後失去一天。人性化的格式Tue, 03 Jan 2012 19:00:00 CST -06:00就是ActiveSupport :: TimeWithZone在inspect編輯和控制檯使用x.inspect顯示x時表示自己的方式。

就固定您的查詢去,只需使用t.utc發送時間t之前,你應該是好的。

+0

我的主要問題原來是ActiveRecord在使用'DATE()'函數時沒有正確處理日期時間轉換,感謝您的幫助 – Schneems 2012-01-15 18:34:11

0

在application.rb中

集config.active_record.default_timezone來配置你的Rails應用程序時區:本地,因爲它被設置爲:在application.rb中UTC默認

粘貼到你的應用程序的代碼.rb

config.active_record.default_timezone = :local #or :utc 
config.time_zone = "Singapore" #your timezone 
相關問題