2017-10-17 103 views
4

我試圖用存儲在Rails中精確到毫秒的時間標記,但價值被擡高了,當我取回從數據庫中記錄:存儲時間毫秒的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" 

不知道這裏發生了什麼事。存儲在數據庫中的毫秒值是正確的,類型轉換前的原始值也是如此(參見最後一行),當它重新投入Ruby時間時,它就會被忽略。

注:

規格:的Rails/ActiveRecord的4.2.6,紅寶石2.3.0,9.5.0的Postgres,OSX)


UPDATE:
我只是想再現這個問題一個與我目前的應用程序完全相同的rails/ruby​​/postgres版本的新的rails應用程序,並且無法做到這一點!而且,由於其他人也無法複製,這意味着這是我的應用程序明確具體的東西,我需要進一步挖掘以試圖隔離造成這種情況的原因......當我獲得更多信息時會更新。

+0

這可能是一個時區的事情。您是否檢查了與UTC時間戳相對的值?你可能會在'UTC'節省時間並檢索'GMT'? – Cyzanfar

+0

@Cyzanfar - 查看更新,UTC中的相同內容。 (無論如何,時區差異不會影響秒/毫秒吧?) – Yarin

+0

正確它不應該影響它......讓我對我的結局做一些研究。讓我知道是否以及何時找到解決方案。這是一個有趣的問題。 – Cyzanfar

回答

-1

檢查數據庫/表時區vs Rails時區vs系統時區,看起來您在保存的內容和返回的內容之間有5小時的差異,這看起來與UTC和EST之間的差異相對應。

+0

這不是時區問題。問題是關於以毫秒爲單位的差異,而不是幾個小時。 – Yarin

+0

您是否嘗試存儲以毫秒(* 1000)爲單位的時間戳,然後是Time.at(ts/1000)?我注意到有時顯然隨機值會變成四捨五入整數(或者,不是那麼多的整數,考慮到他們仍然會有一個尾隨.00001或什麼時候投給to_f) –

1

我不能使用Rails 4.2.65.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 

你能運行這個例子,並告訴該問題是否明確的Rails應用程序再現?

+0

我也無法重現這個問題。 –

+0

@itsnikolay果然,我只是嘗試在一個新的rails應用程序中重現此問題*與我的當前應用程序完全相同的rails/ruby​​/postgres版本*,並且無法做到這一點!看起來我需要進一步挖掘,以嘗試隔離是什麼導致此.. – Yarin

+0

@Yarin嘗試調試,一步一步從您的應用程序中添加每個gem Gemfile在我的示例應用程序Gemfile ^^。因爲一些寶石可以爲自己的目的打補丁日期。如果你不能用完整的寶石列表來重現它,那麼你應該開始在你的代碼中查找問題(從config/initializers等開始搜索,直到跟蹤)。 – itsnikolay