2

在我的应用程序中,用户为任务设置了特定的结束时间。加载任务时,它会使用该任务的信息创建相应的 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))

这绝不是一个伟大/永久的解决方案。我现在有点时间紧迫,这将满足我的需要。

4

1 回答 1

3

我建议您离开config.time_zoneUTC这样您就不会在数据库中看到这些奇怪的变化。

如果您想对应用程序的用户强制使用特定的时区,那么最好的选择是作为before_filterinside ApplicationController

before_filter :set_timezone
def set_timezone
  Time.zone = "Eastern Time (US & Canada)"
end

这样,所有时间都将作为 UTC 时间保存到数据库中,但在网站上显示为东部时间。


这样做的原因非常简单:从一个通用中央时间 (UTC) 转换比从某个任意点转换回 UTC,然后再转换到其他任意点更容易。

于 2013-10-21T03:53:08.613 回答