首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails数据精度损失

Rails数据精度损失
EN

Stack Overflow用户
提问于 2014-06-03 16:06:52
回答 1查看 723关注 0票数 0

我对Rails/活动记录和日期有一个恼人的问题,我正在努力弄清楚。我们正在为复合键使用日期字段,我正在将其转换为时间戳,以便更容易地作为URL参数使用。这很好,但是在将时间戳转换回DateTime之后,我在试图查找记录时有不一致之处。当对象被序列化时,发回的ID看起来类似于1401810373.197,63,其中第一个数字是毫秒的时间戳,第二个值是rails通常使用的原始ID。

当收到带有此ID的请求时,将使用以下方法解析时间戳

代码语言:javascript
复制
... get timestamp from input ...
Time.at(Rational(timestamp)).utc.strftime('%Y-%m-%d %H:%M:%S.%3N')

这和预期一样工作,使用它生成的查询也可以正常工作。问题在于这里产生的日期时间与原始对象上的日期时间略有不同。它们是由类似于1ms的东西完成的,我假设这是由于在使用to_f获取时间戳时失去了精确性。

我用下面的代码在控制台中做了一个快速测试来复制它

代码语言:javascript
复制
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方法只是使用to_f来转换created_at字段。我尝试过将它更改为"%.6f" % m.created_at.to_f,但这并没有改变任何事情。

有什么我可以做的,以防止这种差异的时间,因为它造成了一系列的问题。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-04 16:32:26

最终完全失去了准确性。现在,数据库有了一种类型的timestamp(0),rails已经被修改为不提供毫秒。似乎正在发挥作用:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24019867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档