1

今年我参加了 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。

我注意到“创建”以 UTC 格式保存,但 Date.today 使用用户的本地时区。

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

另一个例子来说明这个问题:

  1. 我想在美国东部标准时间晚上 11 点登记家务。
  2. 服务器已经在第二天(例如:12)。
  3. Rails 将数据保存在第二天的日期 (12)。
  4. 但用户仍在第 11 天。
  5. 从技术上讲,使用当前方法的用户可以再次保存条目,因为日期与数据库和用户界面不同。

如何解决这个问题?

4

2 回答 2

1

默认情况下,Rails 3 将所有时间保存在 GMT+00:00 时区的相对数据库中。因此,您必须在计算时间时根据您的时区设置偏移量。否则,您可以通过添加以下内容来更改默认 Activerecord 时区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)')
于 2012-10-17T01:13:40.127 回答
1

默认情况下,Rails 会将时间以 UTC 格式保存到数据库中。如果您正在使用DATE([Date.today]),那么它将在 11 日而不是 12 日查找记录。要获得正确的日期,您可能希望设置Time.zone为用户的当前时区,然后进行查询。

我构建了一个名为by_star的 gem来处理这种日期搜索,我认为你应该使用它。有了它,您的查询将是这样的:

RegisteredChore.today.where(:user_id => user.id, 
                            :home_id => home.id,
                            :chore_id => chore.id)
于 2012-10-17T00:35:12.470 回答