我对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
此输出显示多个true
和false
值,因此转换中肯定存在问题。
目前,to_param
方法只使用created_at
转换to_f
字段。我已经尝试将其更改为"%.6f" % m.created_at.to_f
,但这并未改变任何内容。
我能做些什么来防止这种时间差异,因为它会导致一系列问题。
目前正在Postgres上运行,其中created_at
列是timestamp(3)
列。我们将Rails 4.1
与jRuby 1.7.12
答案 0 :(得分:0)
完全放弃了准确性。现在,数据库的类型为timestamp(0)
,并且rails已被修改为不提供毫秒数。似乎工作:))