这必须是一件容易的事情,但我认为Rail的时区实施正在放弃我的工作......
如何在Rails 3(和ruby 1.9.2)中创建一个范围来查询今天创建的记录?
目前,我正在这样做:
scope :today, lambda {
where("created_at >= ? and created_at <= ?",
Date.today.beginning_of_day, Date.today.end_of_day)
}
它似乎没有按预期工作。我希望“今天”代表用户当地时区从上午12点到晚上11:59的24小时。我是否需要将日期转换为UTC或其他什么?
答案 0 :(得分:3)
您需要考虑用户的时区。也就是说,用户时区的日期和结束日期。为此,首先解析用户时区的当前时间。您可以将区域设置为用户的时区并进行计算,也可以使用以下代码的变体直接解析时间。
timezone = current_user.timezone # Mountain Time (US & Canada)
users_current_time = ActiveSupport::TimeZone[timezone].parse(Time.now.to_s)
users_current_time.beginning_of_day
和users_current_time.end_of_day
应生成正确的时间范围(如果UTC是您的应用程序时区,您应用将转换为UTC并触发查询)
如果您只想使用范围执行此操作,那么我建议您设置所有操作的Time.zone = current_user.timezone
before_filter
并在范围内使用它。 This
railscast可以很好地了解如何做到这一点。
答案 1 :(得分:1)
如果您正在使用mysql,那么我认为您只想在当天进行匹配,而不是时间对吗?换句话说,你想要从12月1日开始的所有记录。如果您只是搜索日期,则在12月1日的凌晨12:00至晚上11:59之间暗示。
scope :today, lambda {
where("created_at = ?",
Time.now.strftime("%Y-%d-%m")
}
这样的事情应该有效
答案 2 :(得分:0)
这个怎么样?
scope :today, lambda {
where("created_at >= ? and created_at <= ?",
Date.today.beginning_of_day.utc, Date.today.end_of_day.utc)
}