DEV Community

Cover image for Milliseconds in Ruby
David Boureau
David Boureau

Posted on • Edited on • Originally published at alsohelp.com

3 1

Milliseconds in Ruby

article originally published here : https://alsohelp.com/blog/ruby-milliseconds/

How to get milliseconds in Ruby ? Let's explore 3 scenarii.

1. Display time, down to milliseconds in Ruby

current_time = Time.now
current_time.strftime('%H:%M:%S.%L')
# => "10:52:07.119"
Enter fullscreen mode Exit fullscreen mode

If you want more info about strftime, please read this article : https://www.bootrails.com/blog/ruby-strftime-short-and-long-story/ - milliseconds, however, were not covered at this time :)

2. Get current time system in milliseconds

First possibility is to use .strftime, again :

current_time = Time.now
current_time.strftime('%s%L')
# => "1643017927119"
Enter fullscreen mode Exit fullscreen mode

Please note the result is a String.

The second possibility is the following :

(current_time.to_f * 1000).to_i
# => 1643017927119
Enter fullscreen mode Exit fullscreen mode

The result is a number.

3. Elapsed time in milliseconds in Ruby

Ruby-on-Rails method

If you are in the Rails environment, the .in_milliseconds method already exists.

# Assuming Rails is loaded
time_a = Time.now
sleep(2)
time_b = Time.now
# Just call .in_milliseconds method
(time_b - time_a).in_milliseconds
# => 2016.464
Enter fullscreen mode Exit fullscreen mode

Pure Ruby solution

If you just want the number of milliseconds elapsed since Epoch, type

DateTime.now.strftime("%Q")
# => "1643018771523"
DateTime.now.strftime("%Q").to_i
# => 1643018771523
Enter fullscreen mode Exit fullscreen mode

But if you need a difference between two time, you will have to write your own method :

def time_difference_in_milliseconds(start, finish)
   (finish - start) * 1000.0
end
time_a = Time.now
sleep(2)
time_b = Time.now

elapsed_time = time_difference_in_milliseconds(time_a, time_b)
# => 2020.874
Enter fullscreen mode Exit fullscreen mode

If you don't mind about Monkey Patching, here is another possibility :

class Time
  def to_ms
    (self.to_f * 1000.0).to_i
  end
end

time_a = Time.now
sleep(2)
time_b = Time.now
elapsed_time = time_b.to_ms - time_a.to_ms  
# => 2028

Enter fullscreen mode Exit fullscreen mode

A word of caution

We found an interesting article here about Ruby's lack of precision with the clock. Whereas we do not very often need a high precision in the web industry, it's always good to know.

Enjoy !

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay