内存时间和数据库中的时间:错误或功能?

时间:2012-10-18 12:08:49

标签: ruby time activesupport

我最近发现这种奇怪的行为涉及实例化Time对象(例如,使用Time.now),然后将其值用于算术运算,最终将返回一个Integer。我的用例如下:

我实例化时间:

time = 3.days.from_now

然后我用它来知道从现在开始直到那个时间的秒数:

now = Time.now
diff = time - now #=> returns an Integer

现在我将该时间存储在DB中(假设a是一个类似ActiveRecord的实例,它将在DATETIME列中存储时间):

a.date = time
a.save

现在谈到最棘手的部分:

a.reload
time2 = a.date
diff2 = time2 - now #=> returns an Integer
diff == diff2

最后一个断言有时会是假的,有些则是真的。事实是,当一个实例化Time对象时,其用于Time算术运算的值包含高达纳秒和微秒的精度,这将在“ - ”操作的结果值中考虑。但是当它被存储时,“微精度”被遗忘,并且当加载存储在db中的时间时,它没有纳秒或微秒。因此,它与我之前分配给该对象属性的时间实例本质上是不同的。这会混淆我的差异计算。

所以,问题是:如何从Time实例化,以便实例只精确到几秒钟,因此相当于从db获取的时间,如果最终存储该时间实例?我更喜欢独立于ActiveSupport的解决方案,尽管也欢迎AS建议。目标是:diff必须始终等于diff2。

1 个答案:

答案 0 :(得分:1)

如果您只需将Time截断为秒,则可以使用此选项,例如:

t = Time.at(Time.now.to_i)

而不是Time.now

编辑:刚刚注意到Time#round方法:

t = Time.now.round

也应该这样做。