2012-03-09 5 views
1

私は、以下のものを使用して(私の現在のタイムゾーンで)今日作成「エントリー」を見つけようとしています:()Railsとタイムゾーン

Entry.where("DATE(created_at) = DATE(?) AND email = ?", Time.now, email) 

Time.nowは私の現在のゾーンの時間が、クエリを与えています各エントリのcreated_atカラムのUTC時刻を検索しているようです。

今日、サーバーのタイムゾーンで作成されたエントリをどのように見つけることができますか?

答えて

11

SQLでDATE()関数を呼び出した直後に、タイムゾーン情報を失うことになります。心に留めておくべき二つのことがあります。データベース内の

  1. すべてはUTCとDATE()の結果が含まれてすべてになります。
  2. ローカルタイムゾーン内の1つの日付(日)は、UTCで2つの日付を簡単に通過できます(両方の辺)のタイムスタンプ(UTC)の日付コンポーネント全体を見る必要があります。

このような何か作業をする必要があります:

now = Time.now 
Entry.where('created_at between :start and :end and email = :email', 
    :start => now.beginning_of_day, 
    :end => now.end_of_day, 
    :email => email 
) 

回は自動的にUTCに変換する必要があります。上限を少し違って処理したいかもしれません。 end_of_dayを使用すると23:59:59となりますので、キャプチャしたいものをスリップするための小さな部屋があります。あなたはこのように(SQLのbetween使用していることではなく、閉じた間隔)明示的な半開区間を使用して、その問題を回避することができます

now = Time.now 
Entry.where('created_at >= :start and created_at < :end and email = :email', 
    :start => now.beginning_of_day, 
    :end => now.tomorrow.beginning_of_day, 
    :email => email 
) 
+1

これは私が必要としていたものです。ありがとう! –

+1

良い説明! – Jaswinder

1

Time.now.utcを使用しますか?

+0

私はそのことを考えて、それはそれからではないローカル、UTCでの一日の24時間のスパンに基づいてエントリを返します。右? –

1

Time.zone.nowを使用してください。これは、ActiveSupport::TimeWithZoneオブジェクトを使用します。このオブジェクトは、データベース検索で使用されると自動的にUTCに変換されます。

+0

これは、Time.nowとTime.now.utcを使用するのと同じ効果があるようです。クエリはUTC時間で構築されているように見えますが、それは私がローカルにいる場所ではなく、イギリスで1日以内にエントリを与えます。 –

0

まず、あなたはタイムゾーンオフセットその後、タイムゾーンを取得する必要があります。 contollerで

Time.now.in_time_zone(current_time_zone).utc_offset/3600) * -1 

例current_time_zoneについては は

アメリカ/ Los_Angeles

タイムゾーンオフセットを見つけることです

start_date_format = DateTime.strptime(@start_date, date_format) 
start_date_format_with_hour = 
DateTime.strptime((start_date_format.to_i + timezone_offset*60*60).to_s,'%s').strftime(date_format) 

end_date_format = DateTime.strptime(@end_date, date_format) 
end_date_format_with_hour = DateTime.strptime((end_date_format.to_i + timezone_offset*60*60).to_s,'%s').strftime(date_format) 

@filters_date = "invoices.created_at >= ? AND invoices.created_at < ?", start_date_format_with_hour, end_date_format_with_hour 
関連する問題