我有一個帶日期時間屬性的project
模型來定義截止日期。截止日期爲不同的時區,我接受他們的字符串格式如下圖所示:Rails:不同時區的日期時間
Jan 1st 2013 00:00:00 EST
Feb 9th 2013 23:59:00 PST
我想將這些值存儲在數據庫中的缺省UTC格式。我已經看到有很多選擇來解析時間,如Time.zone.parse
和Time.parse
。我的問題是:解析不同時區的日期時間的最佳做法是什麼?我正在使用Rails 3.2.9
。
我有一個帶日期時間屬性的project
模型來定義截止日期。截止日期爲不同的時區,我接受他們的字符串格式如下圖所示:Rails:不同時區的日期時間
Jan 1st 2013 00:00:00 EST
Feb 9th 2013 23:59:00 PST
我想將這些值存儲在數據庫中的缺省UTC格式。我已經看到有很多選擇來解析時間,如Time.zone.parse
和Time.parse
。我的問題是:解析不同時區的日期時間的最佳做法是什麼?我正在使用Rails 3.2.9
。
你不必擔心,在所有的,只要你設置正確的時區config/application.rb
:
config.time_zone = 'UTC'
你只需將時間字符串分配給屬性,ActiveRecord就會正確轉換它。
1.9.3p125 :002 > project.deadline = "Jan 1st 2013 00:00:00 EST"
=> "Jan 1st 2013 00:00:00 EST"
1.9.3p125 :003 > project.deadline
=> Tue, 01 Jan 2013 05:00:00 UTC +00:00
1.9.3p125 :004 > project.deadline = "Feb 9th 2013 23:59:00 PST"
=> "Feb 9th 2013 23:59:00 PST"
1.9.3p125 :005 > project.deadline
=> Sun, 10 Feb 2013 07:59:00 UTC +00:00
ActiveRecord使用Time.zone.parse
在內部解析字符串。
當您運行Time.parse
時,它會將時間戳轉換爲您在rails中配置的時區。例如,我的rails應用程序運行在EST中。
[5] pry(main)> Time.parse('Jan 1st 2013 00:00:00 EST')
=> 2013-01-01 00:00:00 -0500
[6] pry(main)> Time.parse('Feb 9th 2013 23:59:00 PST')
=> 2013-02-10 02:59:00 -0500
通知的+3:00hrs
爲用於獲取結果到我的EST時區的時間戳。
要獲得每個時間戳的UTC版本,只需調用utc
[7] pry(main)> Time.parse('Jan 1st 2013 00:00:00 EST').utc
=> 2013-01-01 05:00:00 UTC
[8] pry(main)> Time.parse('Feb 9th 2013 23:59:00 PST').utc
=> 2013-02-10 07:59:00 UTC
謝謝!所以我只需要設置'@deadline = Time.parse('Jan 1st 2013 00:00:00 EST')。utc'並將它保存到我的數據庫中,對不對? –
你可以通過嘗試**,切爾西獲得很多問題的答案。將'Time.now.zone'放入控制檯並查看它返回的內容。下面你的問題的答案是**是**,'Time.now'默認使用Rails配置的時區。 – deefour
至於將其保存到數據庫中,Rails會自動將時間戳轉換爲UTC,然後將其存儲到數據庫中,並在返回到配置的時區時拔出。只要'@ deadline'是一個有效的'Time'實例,它將在存儲它之前將'EST'時間轉換爲'UTC'。 – deefour
我是新手,對我來說這似乎很神奇!順便說一下,在我的'項目'模型中,我有一個名爲'is_emergent?'的方法,它將'Time.now'與'project.deadline'進行比較,在我的視圖文件中,我有一個頁面顯示所有緊急項目。問:1)'Time.now'是否也使用默認的配置時區? 2)頁面是否顯示觀看者時區格式的截止日期,或者我需要使用一些js來檢索用戶的本地時區? –
1)當比較兩次時,時區不會影響結果。你可以通過'Time.zone.now'或'Time.now'獲得當前時間。兩者都應該沒問題。 2)頁面默認顯示配置時區的截止日期。你可以用'deadline.in_time_zone(...)'來轉換時區。 – Yanhao
很明顯。謝謝! –