Ruby on rails 为什么我的与时间相关的单元测试每天下午4点中断?

Ruby on rails 为什么我的与时间相关的单元测试每天下午4点中断?,ruby-on-rails,ruby,testing,datetime,Ruby On Rails,Ruby,Testing,Datetime,很长一段时间以来,我一直有这个问题,在一天中的某个时间,我的很多测试都会中断。我有很多测试都是做简单的日期比较,从午夜到下午4点,一切都正常。知道为什么会这样吗?我也在我的环境文件中设置了时区 好像我的一些电话,比如5.5天,从现在到现在,增加了额外的一天 编辑 例如,此测试失败: # Widget that creates items for how many days the trip is gone. def test_should_create_correct_amount_of_day

很长一段时间以来,我一直有这个问题,在一天中的某个时间,我的很多测试都会中断。我有很多测试都是做简单的日期比较,从午夜到下午4点,一切都正常。知道为什么会这样吗?我也在我的环境文件中设置了时区

好像我的一些电话,比如5.5天,从现在到现在,增加了额外的一天

编辑

例如,此测试失败:

# Widget that creates items for how many days the trip is gone.
def test_should_create_correct_amount_of_days_for_trip
  w = DayWidget.create(:trip => trips(:hawaii))
  assert_equal w.days.size, 5
end

# Code in trip model that calculates amount of days
def number_of_days
  (self.return_date.to_date - self.depart_date.to_date).to_i + 1
end

# Test fixture yaml for Hawaii
hawaii:
  depart_date: <%= Time.now.tomorrow.to_s(:db) %>
  return_date: <%= 5.days.from_now.to_s(:db) %>
#小部件,用于为旅行结束的天数创建项目。
def测试应为行程创建正确的天数
w=DayWidget.create(:trip=>trips(:夏威夷))
断言_等于w.days.size,5
结束
#计算天数的行程模型中的代码
def天数
(self.return\u date.to\u date-self.depart\u date.to\u date)。to\u i+1
结束
#夏威夷测试夹具yaml
夏威夷:
出发日期:
返回日期:

下午4:00后,上述测试失败,并表示它创建了6天而不是5天:(

你可能在太平洋时区,比UTC晚8小时(这就是为什么他们在下午4点开始休息,因为那是UTC午夜的时候)

在没有看到测试/比较代码的情况下,我所能说的就是确保您将日期/时间与同一位置(UTC与UTC或localtime与localtime)进行比较

更新:好,它看起来像
时间。现在
返回一个
时间
对象,而使用
XXX.days。从现在开始
返回一个
ActiveSupport::TimeWithZone
对象,导致对时区的不同处理:

ruby-1.9.2-p136 :009 > (Time.now+5.days).to_s(:db)
 => "2011-02-08 19:40:24" 
ruby-1.9.2-p136 :010 > 5.days.from_now.to_s(:db)
 => "2011-02-09 03:40:29" 
我的建议是,在您的固定装置中,在您的时间拨打
.utc
,如下所示:

ruby-1.9.2-p136 :017 > 5.days.from_now.utc.to_s(:db)
 => "2011-02-09 03:42:39" 
ruby-1.9.2-p136 :018 > (Time.now+5.days).utc.to_s(:db)
 => "2011-02-09 03:42:39" 

或者直接切换到使用
1.day.from_now
而不是
Time.now.tomory
来保持类型的一致性。

如果您真正处理的只是日期,请确保将小时、分钟和秒设置为0,否则您将受创建日期的时间的支配。

您也可以使用而不是
Time.n噢


Time.current
返回
ActiveSupport::TimeWithZone
就像
#ago
#from#now
一样,因此您可以安全地比较它们返回的日期。

是的,所有内容似乎都得到了正确的比较。我刚刚编辑了我的帖子来展示一个例子。感谢我更新的答案…
时间。现在
返回一个c与
5.days.from\u now
完全不同的类类型。非常感谢您的帮助!这肯定是我代码中的问题。我不知道返回了不同的时间对象。现在的问题是,我的代码库中有一堆时间对象,我正在混合和匹配(time.now和1.day.ago)。我是否应该对每个时间对象应用.utc以保持一致性,还是这样做太过分了?在数据库或我的比较中将它们设置为0?在创建日期对象时将它们设置为0。