2016-11-05 75 views
0

我的Rails應用程序託管在帶有Postgress數據庫的Heroku上。對於某些模型,我詢問用戶選擇了一天的時間,這是我保存模型前結合日期:在Heroku上的Rails中修復數據庫的時區問題

def create_timestamp 
    self.date = day.to_datetime + time.seconds_since_midnight.seconds 
    end 

當我今天選擇了例如@ 20點50分○○秒和商店它在數據庫中,我的記錄是這樣的:

<Report id: 1, account_id: 1, date: "2016-11-05 20:50:00", description: "test", created_at: "2016-11-05 19:50:57", updated_at: "2016-11-05 19:50:57", deleted_at: nil, user_id: 1, report_category_id: 2, time: "2000-01-01 20:50:00", day: "2016-11-05"> 

正如你可能會注意到,在created_at日期是不同的,因爲它是在不同的時區。雖然created_at存儲在UTC +0000中,但使用本地時區的自定義日期爲CET +0100。

所以當我輸入控制檯:Report.find(1).date,它返回2016-11-05 21:50:00 +0100。

如何在初始集中存儲正確的日期,或在查詢時使數據庫返回正確的時區?

感謝

回答

1

你在做什麼目前基本上是這樣的:

>> date = Date.new(2016, 11, 6) 
=> Sun, 06 Nov 2016 
>> time = Time.new(2000, 1, 1, 20, 50, 0) 
=> 2000-01-01 20:50:00 +0100 
>> date.to_datetime + time.seconds_since_midnight.seconds 
=> Sun, 06 Nov 2016 20:50:00 +0000 

to_datetime將時區少DateDateTime代表在該日期午夜UTC,然後你加20小時50分鐘。

而不是午夜UTC,你想在你當地的時區午夜作爲你的出發點。所以,你可以做到這一點,例如:然後

>> date.in_time_zone + time.seconds_since_midnight.seconds 
=> Sun, 06 Nov 2016 20:50:00 CET +01:00 

Rails的應該是足夠的智慧在數據庫中存儲和回CET從數據庫中檢索時,當將其轉換爲UTC。

要清楚的區別,比較:

>> date 
=> Sun, 06 Nov 2016 
>> date.to_datetime 
=> Sun, 06 Nov 2016 00:00:00 +0000 
>> date.in_time_zone 
=> Sun, 06 Nov 2016 00:00:00 CET +01:00 
+0

大,由於返回的時間! –

0

您應該使用

Time.zone.now 
# or 
Time.current 

將在時區

+0

我正在嘗試處理用戶輸入,它可能與當前時間不同。儘管感謝您的回覆。 –