我在軌道中處理日期和時區的最佳方式是什麼?Rails和日期,默認情況下它們是以UTC存儲的嗎?
Scenerio:我有客戶在世界各地的網站上購買產品,當他們登錄時,他們可以選擇來自哪個時區。
所以我相信我應該將所有內容都存儲在數據庫中,然後在前端我應該將日期轉換爲用戶設置的時區首選項。
他們的Ruby和Rails和日期時間等任何陷阱?
我是新來的鐵軌,所以我正在尋找如何正確處理這個問題的指導。
我在軌道中處理日期和時區的最佳方式是什麼?Rails和日期,默認情況下它們是以UTC存儲的嗎?
Scenerio:我有客戶在世界各地的網站上購買產品,當他們登錄時,他們可以選擇來自哪個時區。
所以我相信我應該將所有內容都存儲在數據庫中,然後在前端我應該將日期轉換爲用戶設置的時區首選項。
他們的Ruby和Rails和日期時間等任何陷阱?
我是新來的鐵軌,所以我正在尋找如何正確處理這個問題的指導。
幸運的是,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版本。
謝謝,希望我已經理解了所有事情,因爲它看起來很簡單!現在爲貨幣/貨幣問題:) – Blankman
@Blankman:對於貨幣/貨幣問題,請參閱我的答案在這裏:http://stackoverflow.com/questions/4798651/rails-money-gem-converts-all-amounts-to-zero/4800159#4800159 – apneadiving
好吧,看看你的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需要在那裏。
是的,他們是。在應用程序中,無論何時顯示用戶的日期或時間,您需要的只是添加時區偏移量(例如:GMT + 1的date + 1.hour
)。請記住,您還需要照顧夏令時。爲了提高效率,請考慮在用戶表中添加2列:timezone和time_offset。然後你會在每個情況下做類似
= @order.created_at + session[:user].time_offset
而不是始終檢查配置文件中設置的每個時區的偏移量。
我發現
rake time:zones:all
是非常有用的。它顯示偏移量列表,然後顯示區域名稱字符串。例如:
* UTC +12:00 *
Auckland
Fiji
Kamchatka
Magadan
Marshall Is.
Solomon Is.
Wellington
我需要在以下application.rb中(不直觀給出缺省時區字符串「山地時間(美國&加拿大)」):
config.time_zone = 'Wellington'
我會像你描述:將所有內容記錄爲UTC。這裏你有什麼問題? – apneadiving
默認情況下以UTC記錄存儲事物嗎? – Blankman
對不起,在標題中... – apneadiving