今年我参加了Rails Rumble,我发现自己被时区问题纠缠不清。
我在linode上传了我的应用程序,我住在EST时区或-4到UTC。
我有一个模型,通过执行以下操作可以节省成本:
def self.processing_creation(user_id, home_id, chore_id)
registered_chore = RegisteredChore.where("DATE(created_at) = ?", Date.today).find_by_user_id_and_home_id_and_chore_id(user_id, home_id, chore_id)
unless registered_chore
registered_chore = RegisteredChore.create(user_id: user_id, home_id: home_id, chore_id: chore_id, created_at: Time.zone.now)
user = registered_chore.user
user.add_one_chore_point
end
registered_chore
end
RegisteredChore.where(“DATE(created_at)=?”,Date.today).find_by_user_id_and_home_id_and_chore_id(user_id,home_id,chore_id)
即使刚刚创建了数据,也会返回false。
我注意到“create”以UTC格式保存,但Date.today使用用户的本地时区。
处理此问题的最佳方法是什么?
另一个说明问题的例子:
如何解决这个问题?
答案 0 :(得分:1)
默认情况下,Rails会将数据库的时间节省为UTC。如果您正在使用DATE([Date.today])
,那么它将在11日而不是12日查找记录。要获得正确的日期,您可能希望将Time.zone
设置为用户的当前时区,然后执行查询。
我构建了一个名为by_star的宝石来处理这种日期搜索,我想你应该使用它。有了它,您的查询将是:
RegisteredChore.today.where(:user_id => user.id,
:home_id => home.id,
:chore_id => chore.id)
答案 1 :(得分:1)
默认情况下,Rails 3将所有时间保存在GMT + 00:00时区的数据库中。因此,您必须在计算时间时设置偏移量,具体取决于您的时区。否则,您可以通过将以下内容添加到application.rb
config.time_zone = 'Your time zone' (Example: 'Eastern Time (US & Canada)')
config.active_record.default_timezone = 'Your time zone' (Example: 'Eastern Time (US & Canada)')