在我的应用程序中,用户为任务设置了特定的结束时间。加载任务时,它会使用该任务的信息创建相应的 CheckIn(本例中的 self 是任务):
def create_checkin_end_time(day)
week = (Date.today .. Date.today + 6)
week.each do |day_of_week|
if day_of_week.strftime("%A") == day
return DateTime.new(day_of_week.year, day_of_week.month, day_of_week.day, self.end_time.hour, self.end_time.min)
end
end
end
我已将 config.time_zone 设置为等于“东部时间(美国和加拿大”),但不是将任务创建为 UTC,而是作为 EST 提交,然后从中减去 4 小时。
[2] pry(main)> CheckIn.last.end_time
CheckIn Load (0.7ms) SELECT "check_ins".* FROM "check_ins" ORDER BY "check_ins"."id" DESC LIMIT 1
=> Sun, 20 Oct 2013 19:30:00 EDT -04:00
[3] pry(main)> Task.last.end_time
Task Load (0.7ms) SELECT "tasks".* FROM "tasks" ORDER BY "tasks"."id" DESC LIMIT 1
=> Sun, 20 Oct 2013 23:30:00 EDT -04:00
该模型实例的结束时间应该是晚上 11 点,具体取决于用于创建它的任务。这是我第一次在 Rails 中使用时间,因此非常感谢任何帮助。谢谢你。
更新: 将其切换回 UTC 并将方法添加到 ApplicationController,但这里真正的问题是我创建 CheckIn 的方式。因为 Task.end_time 在创建过程中用作参考,并作为 EST 从数据库中调用,所以在创建 CheckIn 时偏移量增加了一倍。真奇怪。我的解决方案是在创建时使用 .change:
CheckIn.create(task_id: self.id, start_time: self.create_checkin_start_time(day).change(:hour => self.start_time.hour + 4), end_time: self.create_checkin_end_time(day).change(:hour => self.end_time.hour + 4))
这绝不是一个伟大/永久的解决方案。我现在有点时间紧迫,这将满足我的需要。