我试图在Rails中存储毫秒精度的时间戳,但是当我从数据库中检索记录时,该值会被抬高:
record.time_stamp = Time.utc(2017,1,1,1,1,1.35)
保存前检查时间:
record.time_stamp.strftime('%H:%M:%S.%L')
=> "01:01:01.350"
record.time_stamp.usec
=> 350000
record.time_stamp.to_f
=> 1483232461.35
保存并重新加载:
record.save!
record.reload
保存后检查时间:
record.time_stamp.strftime('%H:%M:%S.%L')
=> "01:01:01.006"
record.time_stamp.usec
=> 6108
record.time_stamp.to_f
=> 1483232461.0061078
record.read_attribute_before_type_cast("time_stamp") // Read raw value before type casting
=> "2017-01-01 01:01:01.35"
不确定这里发生了什么。存储在DB中的毫秒值是正确的,就像压缩之前的原始值一样(参见最后一行),它在重新投入Ruby Time时就搞砸了。
注意:
(规格: Rails / ActiveRecord 4.2.6,ruby 2.3.0,Postgres 9.5.0,OSX)
更新
我刚尝试在一个新的rails应用程序中使用与我当前应用程序完全相同的rails / ruby / postgres版本重现此问题,并且无法做到!而且由于其他人也无法重现,这意味着这是我的应用程序明确特定的东西,我需要进一步挖掘以尝试隔离导致此问题的原因...当我有更多信息时会更新。
答案 0 :(得分:1)
我无法使用Rails 4.2.6
和5.0.5
(以及Ruby 2.3.1
,Postgres 9.6.4
)重现此问题
# Gemfile
ruby '2.3.1'
gem 'rails', '4.2.6'
gem 'pg'
require 'active_record'
# example.rb
class Record < ActiveRecord::Base
establish_connection \
adapter: 'postgresql',
database: 'try_timestamp',
username: 'postgres'
connection.create_table table_name, force: true do |t|
t.datetime :time_stamp
end
end
time_stamp = Time.utc 2017,1,1,1,1,1.35
record = Record.new time_stamp: time_stamp
p record.time_stamp.strftime('%H:%M:%S.%L')
p record.time_stamp.usec
p record.time_stamp.to_f
record.save!
record.reload
p record.time_stamp.strftime('%H:%M:%S.%L')
p record.time_stamp.usec
p record.time_stamp.to_f
# terminal command
❯ createdb try_timestamp
❯ bundle install
❯ bundle exec ruby example.rb
"01:01:01.350"
350000
1483232461.35
"01:01:01.350"
350000
1483232461.3500001
您是否可以运行此示例并告知问题是否在clear rails app上重现?
答案 1 :(得分:1)
这是由vincenty gem引起的。告诫者......
答案 2 :(得分:-1)
检查数据库/表时区与Rails时区与系统时区,看起来您保存的内容与返回的内容之间存在5小时的差异,这似乎与UTC和EST之间的差异相对应。