2017-10-17 5 views
4

레일에 밀리 초 단위로 시간을 저장,하지만 난 DB에서 레코드 검색 할 때 값을 올려요됩니다 : 저장하기 전에나는 레일에서 밀리 초 정밀도와 타임 스탬프를 저장하기 위해 노력하고있어

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으로 다시 캐스트 할 때 실수입니다.

주의 사항 : - 그 요인이 될해서는 안 난 그냥 (밀리 초)을 저장하기 위해 노력하고있어하지만

(사양 : 레일/액티브 4.2.6, 루비 2.3.0, 포스트 그레스 9.5.0, OSX)


UPDATE :
난 그냥이 문제를 재현 시도 현재의 앱과 동일한 레일/루비/포스트 그레스 버전을 가진 새로운 레일 앱으로 할 수 없었습니다! 그리고 다른 사람들도 재현 할 수 없기 때문에 이것은 내 앱에 명확하게 특정한 것임을 의미하며,이 문제를 일으키는 원인을 파악하기 위해 더 파고들 필요가 있습니다 ... 자세한 정보가있을 때 업데이트됩니다.

+0

이것은 시간대 일 수 있습니다. UTC 타임 스탬프와 비교하여 얻은 가치를 확인 했습니까? 시간을'UTC'로 저장하고'GMT '를 검색 할 수 있습니까? – Cyzanfar

+0

@Cyzanfar - UTC의 업데이트를 참조하십시오. (어쨌든, 시간대 차이는 초/밀리 초에 영향을 미치지 않겠습니까?) – Yarin

+0

맞아요. 영향을 미치지 않아야합니다. 내 연구를 좀 해봅시다. 해결책을 찾으면 언제든지 알려주십시오. 흥미로운 문제입니다. – Cyzanfar

답변

-1

데이터베이스/테이블 시간대 대 레일스 표준 시간대 대 시스템 표준 시간대를 확인하십시오. 저장하는 시간과 반환하는 시간이 5 시간 차이가 나는 것처럼 보입니다. 이는 UTC와 EST의 차이에 해당하는 것으로 보입니다.

+0

시간대 문제가 아닙니다. 문제는 시간이 아닌 밀리 초 단위의 불일치에 관한 것입니다. – Yarin

+0

타임 스탬프를 밀리 초 (* 1000)로 저장하고 Time.at (ts/1000)로 저장해 보았습니까? 나는 너무 때때로 때때로 무작위 값이 정수로 반올림된다는 것을 알아 챘다. (또는 음, to.f를 캐스트 할 때 .00001이나 뭐니 뭐니해도 여전히 정수라고 생각한다.) –

1

나는

# 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 

이 예제를 실행하고 문제가 명확 레일 애플 리케이션에 재현 여부를 알 수 없습니다 (루비 2.3.1 포스트 그레스 9.6.4)를 레일 4.2.65.0.5으로 문제를 재현 할 수 있을까?

+0

나는 문제를 재현 할 수 없었다. –

+0

@itsnikolay 물론, 난 그냥 내 기존의 애플 리케이션과 같은 레일/루비/포스트 그레스 버전 *와 새로운 레일 애플 리케이션 * 에서이 문제를 재현 해봤지만, 그것을 할 수 없어! 이 문제를 일으키는 것을 분리하려고 더 멀리 파고들 필요가있는 것 같습니다. – Yarin

+0

@Yarin은 app에서 각 보석을 추가하여 단계별로 디버깅을 시도합니다. 내 예제 앱 Gemfile에서 ^^file ^^. 일부 보석은 자체 용도로 날짜 시간을 패치 할 수 있기 때문입니다. 보석의 전체 목록으로 재현 할 수 없으면 코드에서 문제를 찾기 시작해야합니다 (config/initializers 등에서 검색 시작). – itsnikolay