我对Rails/活动记录和日期有一个恼人的问题,我正在努力弄清楚。我们正在为复合键使用日期字段,我正在将其转换为时间戳,以便更容易地作为URL参数使用。这很好,但是在将时间戳转换回DateTime之后,我在试图查找记录时有不一致之处。当对象被序列化时,发回的ID看起来类似于1401810373.197,63,其中第一个数字是毫秒的时间戳,第二个值是rails通常使用的原始ID。
当收到带有此ID的请求时,将使用以下方法解析时间戳
... get timestamp from input ...
Time.at(Rational(timestamp)).utc.strftime('%Y-%m-%d %H:%M:%S.%3N')这和预期一样工作,使用它生成的查询也可以正常工作。问题在于这里产生的日期时间与原始对象上的日期时间略有不同。它们是由类似于1ms的东西完成的,我假设这是由于在使用to_f获取时间戳时失去了精确性。
我用下面的代码在控制台中做了一个快速测试来复制它
Model.all.each do |m|
puts Time.at(Rational("#{m.to_param.split(',').first}")).utc.strftime('%Y-%m-%d %H:%M:%S.%3N') == m.created_at.utc.strftime('%Y-%m-%d %H:%M:%S.%3N')
end它的输出显示了多个true和false值,因此在转换过程中肯定出了问题。
目前,to_param方法只是使用to_f来转换created_at字段。我尝试过将它更改为"%.6f" % m.created_at.to_f,但这并没有改变任何事情。
有什么我可以做的,以防止这种差异的时间,因为它造成了一系列的问题。
这目前正在Postgres上运行,其中created_at列是timestamp(3)列。我们使用的是Rails 4.1和jRuby 1.7.12
发布于 2014-06-04 16:32:26
最终完全失去了准确性。现在,数据库有了一种类型的timestamp(0),rails已经被修改为不提供毫秒。似乎正在发挥作用:)
https://stackoverflow.com/questions/24019867
复制相似问题