2011-03-29 55 views
7

我有一個模型,用戶和現場這樣expires_at創建Rails3中的應用:如何使用rails3將本地時區的日期保存到db?

t.column :expires_at, :timestamp 

在我的數據庫(PostgreSQL的),它具有類型:

timestamp without timezone 

問題是,當我打電話:

@user.expires_at = Time.now 
@user.save 

它被保存到UTC時區的數據庫(我的本地時間是UTC + 1:00,華沙),但我不想那樣。我只想把我的本地時區的時間保存到數據庫中(2011-03-30 01:29:01.766709,而不是2011-03-29 23:29:01.766709)

我可以使用rails3來實現嗎?

+1

小心!如果你有超過一個時區的用戶,這會很快變得混亂。我更願意將所有時間都保存爲數據庫中的UTC,並且只將它們轉換爲非UTC以便在客戶端顯示(您可以將時間從UTC轉換爲在用戶操作系統中使用少量JavaScript設置的時區) 。祝你好運! – 2011-03-30 00:04:17

+0

當我從用戶輸入數據庫查詢呢? ActiveRecord會自動將它轉換爲UTC? – 2011-03-30 00:10:34

+0

這是一個很好的問題,但我懷疑它 - 它必須知道用戶的時區才能夠進行正確的轉換。如果要將用戶提供的日期存儲爲UTC,則可能必須將其轉換爲客戶端(urgh)。我爲我的客戶端轉換使用了[date.js](http://www.datejs.com/),但我只做了顯示 - 我從未接受日期作爲輸入... – 2011-03-30 00:22:57

回答

10

對於本地時區節省時間數據庫這有在application.rb中

config.active_record.default_timezone = :local 
+0

This doesn如果您正在使用Resque,則無法使用。不知道如何處理resque。 – Trip 2013-01-08 23:49:46

2

Rails documentation設置如果您只想對某些列使用本地時間,而不是作爲一個全球性的設置,然後告訴我們這個:

# If your attributes are time zone aware and you desire to skip time zone conversion to the current Time#zone when reading certain attributes then you can do following: 

class Topic < ActiveRecord::Base 
    self.skip_time_zone_conversion_for_attributes = [:written_on] 
end 

(這也跳過了時區轉換寫作,而不只是閱讀)。你可以傳入多個屬性的符號數組。

雖然我不確定引入了哪些版本的Rails。

+0

它在編寫時似乎沒有跳過時區(即它仍然轉換爲UTC),您如何檢查它?當我通過'psql'查詢時,我看到轉換爲UTC的所有值,而不是原來的時區。 – vemv 2016-02-07 01:27:25

+0

您還需要設置'config.active_record.time_zone_aware_attributes = false'來防止保存到數據庫時轉換爲UTC – Turgs 2016-02-21 09:31:41

相關問題