2009-08-20 15 views
2

私は必要なすべてのタイムゾーン情報を持っており、すべての情報をthis railscastに従って正しく保存しています。すべては、時間を表形式で表示するなど、すべての通常の目的に適していますが、私は次のものを保存した時間帯のcurrent_usersにどのように変換できるのでしょうか?ruby​​ on rail to users to timezone

私は、時間ごとのコールの合計数を見つけています

Calls.count(:group => DATE_PART('hour', start_time), 
      :conditions => ["start_time BETWEEN ? AND ?", start, finish] 

このクエリでは、開始時刻と終了時刻の間に時間に行われたすべてのコールすべてに引っ張ります。唯一のことは、UTCとして格納されているデータベースの時間を引き戻すことです。私はTime.now.utc_offsetで私自身の小さな変換方法を書いたが、それはうまくいかないことに気づいた。 time_zoneに保存されているユーザーとデータベースから取得したユーザーを比較し、utc_offsetを追加するとよいでしょう。

time_zoneは、データベースに文字列として東部時間(US &カナダ)の文字列として格納されます。

これを理解する最良の方法は、ユーザーのオフセットをデータベースに保存するように変更することができますが、その前に簡単な方法があるかどうかを確認します。

編集
より明確にするために、クエリは時間と回数のハッシュを返します。だから、例えば:UTCは時間をオフセットとして

   Hour      Count 
       "5"       20 
       "6"       15 
       "7"       35 
       ...       ... 

は時間が戻って来て、私は、ユーザーのタイムゾーンにその数字を変換する必要があるので、例えば、それは東部標準時(米国およびカナダ)を通じて、あなたのループだ場合ハッシュを追加し、時間に-4を加えます。

編集2
私はこれをかなり簡単に把握することができました。まず、Timeオブジェクトを現在のユーザーのタイムゾーンに設定します。だから、:

Time.zone = @current_user.time_zone 
=> "Eastern Time (US & Canada) 

はその後、ハッシュ

hour + Time.now.in_time_zone.utc_offset/3600 

かなり自明の内側に、現在のユーザーの「時」にオフセットを追加しますが、それはあなたが以前に設定され、ゾーンの時刻を取得し、UTCを発見しますオフセットを秒単位で設定しているため、3600で割ります。

+1

少し質問をクリアすることはできますか?ユーザーのタイムゾーンに関する開始時刻と終了時刻を指定するだけですか、またはクエリの作成後にUTC時刻をユーザーのタイムゾーンに変換したいだけですか? – klochner

+1

クエリが作成された後、ユーザーのタイムゾーンにUTC時刻を変換します。 – Ryan

答えて

4

これは役に立ちますか?

t = TimeZone["Eastern Time (US & Canada)"] 
t.utc_to_local(DateTime.now) #gives the local time 

私の前に投稿した人は誰でも自分の答えを削除しました(それは私の答えよりもはるかに良かったです)。彼が彼の答えを取り戻すなら、私は再び私のものを取ります。

+0

これは私にとっては十分であるかもしれませんが、少し更新します。 – Ryan

+1

これはとても助けになりました。あなたが私に時間帯のオブジェクトを設定することができることを示した後に、私は10分を把握しました。私が行ったことを見るには私の編集を見てください。構文は本当に異なる唯一のものです。 – Ryan

0
scope :opened, where("date > '#{Time.now.in_time_zone}'") 
scope :closed, where("date < '#{Time.now.in_time_zone}'")