From: davidm@... Date: 2014-08-21T17:19:06+00:00 Subject: [ruby-core:64491] [ruby-trunk - Bug #10135] Time.at is inaccurate 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/