我正在开发 Rails 应用程序,该应用程序允许用户每天最多发布 2 个帖子,非常简单。
我的问题是如何管理不同用户居住的不同时区。例如,如果我住在伦敦,一天开始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