2015-05-19 34 views
1

我有一個類型爲time的列的數據庫表。到目前爲止,我一直在節省「無區」時間,例如4:00pm。我一直接受這個字符串「原樣」,並且Rails一直很高興地在數據庫中正確保存這個時間字符串。在Rails中使用時區保存時間字符串

我現在需要將該值與時區一起保存。我想以某種方式在EDT中獲取4:00pm時間,並將其作爲UTC保存在數據庫中,即8:00pm。 (我意識到這個下午4點本來是保存爲UTC時間下午4點)。

我不是特別在意這個4:00pm EDT時間如何保存爲UTC,儘管我更喜歡利用Rails'原生行爲,不會讓我的代碼比它需要的更復雜。

知道我的Rails應用程序是以API的形式可能很重要,所以我不會使用任何形式的幫助器或類似的東西。我必須簡單地接受一個字符串。但是,我可以控制該字符串的發送格式。

那麼,總結一下,如何在數據庫中保存UTC時間爲晚上8:00的字符串4:00pm EDT

+0

只是好奇,你爲什麼不保存數據類型的任何特別的原因「時,在區數據庫」? – coderhs

+0

好問題。我認爲,但我認爲存儲日期的正確方法是將所有內容存儲爲UTC。 –

+0

你能確認你使用的是哪個版本的Ruby嗎?版本之間的'時間'類變了很多。 – JSFernandes

回答

0

假設ruby的Time構造函數正確解釋了時區,您只需要在創建的對象上調用utc方法。像這樣:

t = Time.parse("4:00pm EDT") 
t.utc 

如果質量分配在此日期設置,您可能需要設置模型上的before_save處理程序,以設定的時間爲UTC。

編輯由OP

這是確切的形成我的解決方案最終採取:

def earliest_arrival_time=(time) 
    begin 
    write_attribute(:earliest_arrival_time, Time.parse(time.to_s).utc) 
    rescue 
    write_attribute(:earliest_arrival_time, time) 
    end 
end 
+0

我認爲這可能是一個好方向,雖然'Time.new('下午4:00')'評估爲'0004-01-01 00:00:00 -0500'。它將「4」分解爲年份而不是小時。我正在研究它,但在這裏提到這一點,以防您或其他人知道手邊的答案。 –

+0

好吧,它需要'Time.parse'而不是'Time.new'。 –

+0

如果你的'time'是'Time'對象,那麼'time.utc'應該足夠了,我假設你有一個字符串:)不過,我的建議'Time.new'不好,而不是'Time。 parse' – JSFernandes

相關問題