Time.current gives me precision beyond seconds:
> Time.current
Fri, 11 Feb 2022 23:00:18.253185000 UTC 00:00
> Time.current.to_f
1644620430.942064
But Time.at loses the precision :(
> Time.at(1644620430.942064).utc
2022-02-11 23:00:30 UTC
The whole .942064 got truncated. This is messing with some tests that compare dates, because timestamps seem to save with the milliseconds, but I don't know how to create a Time that includes milliseconds
How can I cast a variable of milliseconds into a Time?
CodePudding user response:
As I understand you need nanoseconds precision
Time::at has such form
time = Time.current
# => Fri, 11 Feb 2022 23:36:25.983398537 UTC 00:00
float_time = time.to_f
# => 1644622585.9833987
secs = float_time.floor
# => 1644622585
nsecs = time.nsec
# => 983398537
Time.at(secs, nsecs, :nsec).utc
# => 2022-02-11 23:36:25.983398537 UTC
You can choose precision using one of these keys:
:msecis the number of milliseconds (Integer,Float, orRational) in the range0..1000:usecis the number of microseconds (Integer,Float, orRational) in the range0..1000000:nseckey is the number of nanoseconds (Integer,Float, orRational) in the range0..1000000000
You can also just call utc on Time.current
time = Time.current
# => Fri, 11 Feb 2022 23:36:25.983398537 UTC 00:00
time.utc
# => 2022-02-11 23:36:25.983398537 UTC
CodePudding user response:
I think you're just seeing a formatting problem. Consider:
Time.at(1644620430.942064).strftime('%Y-%m-%dT%H:%M:%S.%N')
# 2022-02-11T15:00:30.942064046
However, if you call to_s:
Time.at(1644620430.942064).to_s
# "2022-02-11 15:00:30 -0800"
Time.at(1644620430.942064).utc.to_s
# "2022-02-11 23:00:30 UTC"
you only get results with one second resolution.
The full precision time is there but you need to be careful to ask for it when you format your time.
