Issue #10135 has been updated by David MacMahon.


John Smart wrote:
> I believe I have found an issue with Time.at.  Many runtimes and DBs use milliseconds since epoch for recording time.  Currently, the only way to generate a Time in ruby with milliseconds is:
> 
> ~~~
> Time.at(milliseconds / 1000.0)
> ~~~

Another (better) way is:

~~~
Time.at(milliseconds.to_r / 1000)
~~~

That passes the non-integer seconds as a Rational rather than a Float so precision is maintained:

~~~
>> Time.at(1381089302195.to_r / 1000).strftime('%N')
=> "195000000"

# Modern Ruby (since 2.x?) can use 'r' suffix for literal Rationals
>> Time.at(1381089302195r / 1000).strftime('%N')
=> "195000000"
~~~

> It seems that somewhere in the MRI, someone is using floating-point math to represent a Time.

Actually, you were the one who started using floating point math to represent Time when you divided `milliseconds` by `1000.0`! :-)


----------------------------------------
Bug #10135: Time.at is inaccurate
https://bugs.ruby-lang.org/issues/10135#change-48438

* Author: John Smart
* Status: Open
* Priority: Low
* Assignee: Akira Tanaka
* Category: 
* Target version: current: 2.2.0
* ruby -v: ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
I believe I have found an issue with Time.at.  Many runtimes and DBs use milliseconds since epoch for recording time.  Currently, the only way to generate a Time in ruby with milliseconds is:

~~~
Time.at(milliseconds / 1000.0)
~~~

However, this is inaccurate:

~~~
> Time.at(1381089302195 / 1000.0).to_f
=> 1381089302.1949997
> Time.at(1381089302195 / 1000.0).strftime('%3N')
=> "194"
~~~

This doesn't make much sense because you would expect:

~~~
> 1381089302195 / 1000.0
=> 1381089302.195
> (1381089302195 / 1000.0).to_f
=> 1381089302.195
~~~

It seems that somewhere in the MRI, someone is using floating-point math to represent a Time.

Is there any other way (workaround) to construct Time with millisecond accuracy?




-- 
https://bugs.ruby-lang.org/