用户输入的Rails日期和时间不是UTC

时间:2013-08-20 01:43:02

标签: ruby-on-rails ruby datetime date-comparison

我已经查看过很多像这样的问题,但似乎没有一个问题符合我的问题,即:

我有一个包含事件的Rails应用程序。事件是具有开始日期(日期字段),开始时间(时间)和结束时间(时间)的属性的模型。当我创建它们时,我没有将任何输入的日期转换为基于UTC的时间(所有时间都是本地的)。

我试图找出事件是否结束。我已经为我的模型添加了一些应该有用的方法,但因为我将苹果(非UTC)与橙色(UTC)时间进行比较。我碰到了一堵砖墙。

因为我正在混合日期和时间,所以我在我的事件模型中添加了以下方法:

助手

  def date_start_time
    return DateTime.new(self.date.year, self.date.month, self.date.day, self.start_time.hour, self.start_time.min, self.start_time.sec)
  end
  def date_end_time
    return DateTime.new(self.date.year, self.date.month, self.date.day, self.end_time.hour, self.end_time.min, self.end_time.sec)
  end

in_past方法

  def in_past
    logger.debug 'comparing end time: ' + self.date_end_time.to_s +  ' to the current time: ' + DateTime.now.to_s
    self.date_end_time <= DateTime.now
  end

我正在Rails控制台中加载一个应该在几分钟内结束的事件,但是我得到了一个真实的in_past:

1.9.3-p194 :020 > event.in_past
comparing end time: 2013-08-19T20:38:00+00:00 to the current time: 2013-08-19T20:37:22-05:00
 => true 

我尝试将.zone添加到我的DateTime.now,但这似乎让它变得更糟。我觉得我在这里尝试了各种区域选项,我真的更喜欢忽略时区,因为所有活动都是当地的。

思考?建议?

1 个答案:

答案 0 :(得分:0)

快速解决方案是将时区添加到rails config(application.rb),就像这样

config.time_zone = '<your local timezone>'

您可以通过

获取所有可用的时区
#rake time:zones:all