今年我参加了 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 使用用户的本地时区。
处理这个问题的最佳方法是什么?
另一个例子来说明这个问题:
- 我想在美国东部标准时间晚上 11 点登记家务。
- 服务器已经在第二天(例如:12)。
- Rails 将数据保存在第二天的日期 (12)。
- 但用户仍在第 11 天。
- 从技术上讲,使用当前方法的用户可以再次保存条目,因为日期与数据库和用户界面不同。
如何解决这个问题?