2011-07-09 45 views
9

我在軌道中處理日期和時區的最佳方式是什麼?Rails和日期,默認情況下它們是以UTC存儲的嗎?

Scenerio:我有客戶在世界各地的網站上購買產品,當他們登錄時,他們可以選擇來自哪個時區。

所以我相信我應該將所有內容都存儲在數據庫中,然後在前端我應該將日期轉換爲用戶設置的時區首選項。

他們的Ruby和Rails和日期時間等任何陷阱?

我是新來的鐵軌,所以我正在尋找如何正確處理這個問題的指導。

+0

我會像你描述:將所有內容記錄爲UTC。這裏你有什麼問題? – apneadiving

+0

默認情況下以UTC記錄存儲事物嗎? – Blankman

+0

對不起,在標題中... – apneadiving

回答

11

幸運的是,Rails幾乎可以幫你處理事情。正如其他人指出的那樣,日期以UTC格式存儲在AR中。如果你有一個time_zone現場爲您的用戶表,你可以做這樣的事情:

# application.rb 
config.time_zone = "Mountain Time (US & Canada)" # Default time zone 

-

# application_controller.rb 
before_filter :set_time_zone, :if => :logged_in? 

protected 
def set_time_zone 
    Time.zone = current_user.time_zone if current_user.time_zone 
end 

所有日期時間應該在你的觀點正確的時區顯示。

我有一個生產應用程序不喜歡使用默認時區,但我不記得它運行的是哪個Rails/Ruby版本。

+0

謝謝,希望我已經理解了所有事情,因爲它看起來很簡單!現在爲貨幣/貨幣問題:) – Blankman

+1

@Blankman:對於貨幣/貨幣問題,請參閱我的答案在這裏:http://stackoverflow.com/questions/4798651/rails-money-gem-converts-all-amounts-to-zero/4800159#4800159 – apneadiving

1

好吧,看看你的config/application.rb文件。

你應該找到註釋行:

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 
# config.time_zone = 'Central Time (US & Canada)' 

所以默認是UTC,但你可以設置任何OU需要在那裏。

1

是的,他們是。在應用程序中,無論何時顯示用戶的日期或時間,您需要的只是添加時區偏移量(例如:GMT + 1的date + 1.hour)。請記住,您還需要照顧夏令時。爲了提高效率,請考慮在用戶表中添加2列:timezone和time_offset。然後你會在每個情況下做類似

= @order.created_at + session[:user].time_offset 

而不是始終檢查配置文件中設置的每個時區的偏移量。

+0

我很困惑,你說有2列,但你的代碼不參考時區列? – Blankman

+0

這意味着沒有。用戶編輯他/她的個人資料時使用時區 - 這是「人性化」的名稱。用戶更新它時 - 將其與時區和偏移量表進行比較,並將time_offset設置爲不再重新獲得偏移量。 – exine

+0

好的,我看到Ogz巫師提出了更好的解決方案,我不知道Rails有類似的東西;) – exine

0

我發現

rake time:zones:all 

是非常有用的。它顯示偏移量列表,然後顯示區域名稱字符串。例如:

* UTC +12:00 * 
Auckland 
Fiji 
Kamchatka 
Magadan 
Marshall Is. 
Solomon Is. 
Wellington 

我需要在以下application.rb中(不直觀給出缺省時區字符串「山地時間(美國&加拿大)」):

config.time_zone = 'Wellington' 
相關問題