私は、ユーザーが1日に最大2つの投稿を非常に簡単に作成できるRailsアプリケーションに取り組んでいます。
私の問題は、さまざまなユーザーが住んでいるさまざまなタイムゾーンをどのように管理するかです。たとえば、私がロンドンに住んでいて、投稿数00.00
で開始および終了する日はでリセットされますが、ニューヨークに住んでいる別のユーザーの場合、カウンターは別の時間にリセットされます。(ではありません)この状況をどのように管理できますか?23.59
00.00
00.00
私は自分自身を説明したいと思います。
更新1
@集まる
コードの問題はtime_zone.utc_offset
、間違った時間デルタを与えることです。
1.9.3p194 :123 > time_zone = ActiveSupport::TimeZone.new("Prague")
=> (GMT+01:00) Prague
1.9.3p194 :124 > DateTime.now.utc.midnight - time_zone.utc_offset
=> Thu, 10 Apr 2003 00:00:00 +0000
どうして?
その代わりに、私はこのコードが便利だと思いました:
User.posts.where(:created_at => DateTime.now.in_time_zone(time_zone).beginning_of_day..DateTime.now.in_time_zone(time_zone).end_of_day).count
ユーザーの日(ユーザーのタイムゾーンを含む)の間に正しい数のメッセージを取得しているようです。どう思いますか?
更新2
@集まる
違いは何ですか:
User.posts.where(:created_at => DateTime.now.in_time_zone(utc_time_zone).beginning_of_day..DateTime.now.in_time_zone(utc_time_zone).end_of_day).count
とあなたの:
1.9.3p327 :015 > time_zone = ActiveSupport::TimeZone.new("Prague")
=> (GMT+01:00) Prague
1.9.3p327 :016 > Time.zone.now.utc.midnight - time_zone.utc_offset
=> 2013-02-15 23:00:00 UTC
パフォーマンスとやり方の面で?
更新3
実際、あなたの例のコードは機能しません。ここを見てください:
# WRONG
1.9.3p194 :096 > user.posts.where('created_at > ?', Time.zone.now.utc.midnight - my_time_zone.utc_offset).count
(0.2ms) SELECT COUNT(*) FROM "messages" WHERE "messages"."sender_id" = 5 AND (created_at > '2013-02-15 23:00:00.000000')
=> 4
# CORRECT
1.9.3p194 :098 > users.posts.where(:created_at => DateTime.now.in_time_zone(my_time_zone).beginning_of_day..DateTime.now.in_time_zone(my_time_zone).end_of_day).count
(0.3ms) SELECT COUNT(*) FROM "messages" WHERE "messages"."sender_id" = 5 AND ("messages"."created_at" BETWEEN '2013-02-16 23:00:00.000000' AND '2013-02-17 22:59:59.000000')
=> 0