我正在开发一个rails应用程序,它允许用户每天最多发两篇帖子,非常简单。
我的问题是如何管理不同用户居住的不同时区。例如,如果我住在伦敦,一天的开始时间是00.00,结束时间是23.59,则posts计数将重置为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

最佳答案

根据你的具体想法,我可以想出两个解决方案。
首先,允许用户在24小时内发布两次,这样做的好处是不分时区:

User.posts.where('created_at > ?', 24.hours.ago).count

如果返回2,那么不要让他们发布。
如果您真的想确保每天不超过2个帖子,那么:
time_zone = ActiveSupport::TimeZone.new(current_user.time_zone)
Users.posts.where('created_at > ?', Time.zone.now.utc.midnight - time_zone.utc_offset).count

用户时区需要保留Rails识别的有效时区。
由于数据库日期时间(创建时间)已在UTC中,请首先将服务器时间规格化为UTC,然后将时间设置为午夜,并应用时区的UTC偏移量所以如果你有人在-7时区,那么它会从0700 UTC开始寻找帖子,对于+3时区的人,它会从2100 UTC开始寻找帖子。
ActiveSupport::TimeZone
为了澄清两者之间的区别,让我举几个例子。
第一个例子是用户在1200时发帖,然后在周一的1800时再次发帖。
使用第一段代码,用户将无法再次发布,直到星期二06:00之后。有了第二段代码,他们可以在周二零时(午夜后)再次发布。
第二个例子是一个用户在2330点发帖,然后在周一的2350点再次发帖同样,在第一个例子中,他们要到星期二2330之后才能再次发帖,但是第二个例子将允许他们在午夜再次发帖,允许他们在0010和0020发帖,在50分钟内给他们4个帖子。
这实际上取决于岗位限制的目的是什么第一个例子的使用和实现将简单得多,因为它不受时区的限制。
如果您从FB提取时区信息,请检查时区信息的格式我猜它将不是一个有效的字符串ActiveSupport::TimeZone将接受。例如,它想要MST(-0700)的"Mountain Time (US & Canada)"如果FB给你一些东西,比如MST的-7或者-25200(-7小时秒),那么你就可以使用这些东西而不需要在AS:TZ上混在一起
回复:更新1
下面是使用Time.zone而不是DateTime的输出
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

关于ruby-on-rails - Rails-不同时区限制每日发布,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14914004/

10-11 03:15
查看更多