Rails 3.2.8 - 如何处理时区?

时间:2012-10-16 21:45:42

标签: ruby-on-rails-3 datetime timezone

今年我参加了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使用用户的本地时区。

处理此问题的最佳方法是什么?

另一个说明问题的例子:

  1. 我想在美国东部时间晚上11点注册家务。
  2. 服务器已在第二天(例如:12)。
  3. Rails会在第二天(12)保存数据。
  4. 但是用户还在第11天。
  5. 从技术上讲,使用当前方法的用户可以再次保存该条目,因为日期与数据库和用户界面不同。
  6. 如何解决这个问题?

2 个答案:

答案 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

来更改默认的Activerecord时区
config.time_zone = 'Your time zone' (Example: 'Eastern Time (US & Canada)')
config.active_record.default_timezone = 'Your time zone' (Example: 'Eastern Time (US & Canada)')