0

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

我实例化一个时间:

time = 3.days.from_now

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

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

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

a.date = time
a.save

现在到了最棘手的部分:

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

最后一个断言有时是错误的,其他断言是正确的。问题是,当实例化 Time 对象时,其用于 Time 算术运算的值包含高达纳秒和微秒的精度,这将在“-”运算的结果值中考虑。但是当它被存储时,“微精度”被留下了,当存储在数据库中的时间被加载时,它没有纳秒或微秒。因此,它本质上不同于我之前分配给该对象属性的时间实例。这弄乱了我的差异计算。

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

4

1 回答 1

1

如果只需要将Timea 截断到一秒,可以使用这个,例如:

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

代替Time.now

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

t = Time.now.round

也应该这样做。

于 2012-10-18T12:30:35.553 回答