According to the ruby documentation takes the at
method, of the Time
class, as argument "the number of seconds" since the Epoch not the "milliseconds" since the Epoch.
Another variant takes as arguments the "seconds" since the Epoch and "Microseconds with frac".
You need to convert number
(the input) from ms
to sec
and us
to get the expected / correct result.
Examples
Wrong (ms interpeted as seconds):
> number = 1512387277084 # ms since epoch
=> 1512387277084
> Time.at(number)
=> 49895-08-24 10:58:04 +0200
Seconds with fractal:
> number2 = number / 1000.0
=> 1512387277.084
> Time.at(number2)
=> 2017-12-04 12:34:37 +0100
> Time.at(number2).usec
=> 84000
> Time.at(number2).nsec
=> 84000110 # Wrong of by 110 ns
> Time.at(number2.round(3)).nsec
=> 84000110 # Wrong of by 110 ns
> Time.at(number2.round(2)).usec
=> 79999 # Wrong
> Time.at(number2.round(2)).nsec
=> 79999923 # Wrong
Seconds only:
> number3 = number / 1000
=> 1512387277
> Time.at(number3)
=> 2017-12-04 12:34:37 +0100
> Time.at(number3).usec
=> 0 # Wrong
> Time.at(number3).nsec
=> 0 # Wrong
Seconds and Microseconds:
ms = number % 1000 # Milliseconds
=> 84
> us = ms * 1000 # Microseconds
=> 84000
> Time.at(number3, us)
=> 2017-12-04 12:34:37 +0100
> Time.at(number3, us).usec
=> 84000 # OK
> Time.at(number3, us).nsec
=> 84000000 # OK
> Time.at(number3, us).to_f
=> 1512387277.084 # OK
Update 2
Seconds as Rational
> number4 = number.quo(1000)
=> (378096819271/250)
> Time.at(number4)
=> 2017-12-04 12:34:37 +0100
> Time.at(number4).usec
=> 84000 # OK
> Time.at(number4).nsec
=> 84000000 # OK
> Time.at(number4).to_f
=> 1512387277.084 # OK