0

通常,我的web應用程序中的日期時間字段由Rails以UTC時間存儲在postgresql數據庫中。當我去,以顯示在網頁上的日期和時間,他們在當地時間顯示,因爲我有類似於下面的代碼的東西:在Rails中轉換爲日期字段的本地時間

before_filter :set_time_zone 

def set_time_zone 
    Time.zone = "Pacific Time (US & Canada)" 
end 

順利,但現在我需要將一些那些datetime領域到date數據庫中的字段(這很重要)。例如,我可能有一個日誌日期的學生開始:

Log.create(at: began_at, student_id: student_id) 

began_at是一個datetime場。沒關係,我已經正確設置了Time.zone,at字段是date,它將存儲在postgresql中,可能是在本地時間的前一天或後一天。當我去顯示那個日期時,它不會被轉換爲當地時間,這是有道理的......如果我沒有存儲時間,Ruby/Rails如何知道它是本地的哪一天?

我需要的是當地的日期被存儲。所以我需要將began_at轉換爲當地時間,然後將其分配給at。在Rails的控制器中做這件事的正確方法是什麼?

我使用最新的穩定的Rails(3.2.9現在)

回答

0

使用use_zone與區域嘗試。

Time.use_zone(zone) do 
    log.at = DateTime.parse(params[:at]) 
end 
0

鑑於UTC時間戳爲:began_at,凌晨1點左右說

[1] pry(main)> Time.zone.now.utc.midnight + 1.hour 
=> 2012-12-20 01:00:00 UTC 

這可以被轉換爲本地時間

[2] pry(main)> Time.zone.name 
=> "Eastern Time (US & Canada)" 

使用Time.parse(str)

[3] pry(main)> x = Time.zone.now.utc.midnight + 1.hour 
=> 2012-12-20 01:00:00 UTC 
[4] pry(main)> Time.zone.parse(x.to_s) 
=> Wed, 19 Dec 2012 20:00:00 EST -05:00 

你可那時,本地時間戳轉換爲Date對象.to_date

[5] pry(main)> Time.zone.parse(x.to_s).to_date 
=> Wed, 19 Dec 201 

然後你就可以設置Log:at用。現在一起

Log.create(at: Time.zone.parse(began_at.to_s).to_date, student_id: student_id) 
相關問題