2016-11-05 5 views
0

My Railsアプリケーションは、PostgoデータベースでHeroku上でホストされています。私は午前20時50分00秒と店@今日のインスタンスに対して選択した場合はHeroku上のRailsのデータベースでのタイムゾーンの問題を修正しました

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

:特定のモデルのために私は私がモデルを保存する前に、これまでに組み合わせる日と時間を選択したようにユーザーに求めていますそれは、データベースに、私の記録は次のようになります。あなたが気づくかもしれませんが、created_atと日付が異なる

<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は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はその日に深夜UTCを表すDateTimeにタイムゾーンレスDateを変換し、あなた20時間50分を追加します。

UTCの午前0時の代わりに、の自宅の時間帯の深夜を出発点にします。だから、たとえば、これを行うことができます:

>> 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

タイムゾーンの時刻を返します

Time.zone.now # or Time.current 

を使用する必要があります! –

0

あなたは素晴らしい、感謝

+0

ユーザー入力を処理しようとしていますが、これは現在の時刻とは異なる可能性があります。あなたの返信をありがとう。 –