很长一段时间以来,我一直有这个问题,在一天中的某个时间,我的测试中有一小部分被打破。我有很多测试正在进行简单的日期比较,从下午到下午4点,一切都运行正常。知道为什么会这样吗?我也在我的环境文件中设置了我的时区。
似乎我的一些电话如5.days.from_now.to_date正在增加额外的一天。
修改
例如,此测试失败:
# 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) %>
在下午4:00之后,上面的测试失败并说它创建了6天而不是5 :(
答案 0 :(得分:8)
你可能在太平洋时区,比UTC晚8小时(这就是为什么在4:00p他们开始打破,因为那时它是在午夜UTC的时候)。
在没有看到您的测试/比较代码的情况下,我所能说的就是确保您将日期/时间与相同位置(UTC与UTC或本地时间与本地时间)进行比较。
更新:好的,看起来Time.now
会返回Time
个对象,而使用XXX.days.from_now
会返回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.tomorrow
来保持类型一致。
答案 1 :(得分:1)
您也可以使用Time.current
代替Time.now
。
Time.current
返回ActiveSupport::TimeWithZone
,就像#ago
和#from_now
一样,因此您可以安全地比较它们返回的日期。
答案 2 :(得分:0)
如果您真的只处理日期,请务必将小时,分钟和秒设置为0,否则您将受制于创建日期的时间。