Rails日期精度损失

时间:2014-06-03 16:06:53

标签: postgresql ruby-on-rails-4 jruby

我对Rails / Active Record和我想要弄清楚的日期有一个恼人的问题。我们使用复合键的日期字段,我将其转换为时间戳,以便更容易用作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

此输出显示多个truefalse值,因此转换中肯定存在问题。

目前,to_param方法只使用created_at转换to_f字段。我已经尝试将其更改为"%.6f" % m.created_at.to_f,但这并未改变任何内容。

我能做些什么来防止这种时间差异,因为它会导致一系列问题。

目前正在Postgres上运行,其中created_at列是timestamp(3)列。我们将Rails 4.1jRuby 1.7.12

一起使用

1 个答案:

答案 0 :(得分:0)

完全放弃了准确性。现在,数据库的类型为timestamp(0),并且rails已被修改为不提供毫秒数。似乎工作:))