Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can Ruby print out time difference (duration) readily?

Can Ruby do something like this?

irb(main):001:0> start = Time.now
=> Thu Nov 05 01:02:54 -0800 2009

irb(main):002:0> Time.now - start
=> 25.239

irb(main):003:0> (Time.now - start).duration
=> "25 seconds"

(the duration method doesn't exist now)... and similarly, report

23 minutes and 35 seconds
1 hour and 33 minutes
2 days and 3 hours

(either report the whole duration, up to how many seconds, or report up to 2 numbers and units (if day and hour is reported, then no need to tell how many minutes))

like image 333
nonopolarity Avatar asked Nov 05 '09 09:11

nonopolarity


2 Answers

Here's a quick and simple way to implement this. Set predefined measurements for seconds, minutes, hours and days. Then depending on the size of the number, output the appropriate string with the those units. We'll extend Numeric so that you can invoke the method on any numeric class (Fixnum, Bignum, or in your case Float).

class Numeric
  def duration
    secs  = self.to_int
    mins  = secs / 60
    hours = mins / 60
    days  = hours / 24

    if days > 0
      "#{days} days and #{hours % 24} hours"
    elsif hours > 0
      "#{hours} hours and #{mins % 60} minutes"
    elsif mins > 0
      "#{mins} minutes and #{secs % 60} seconds"
    elsif secs >= 0
      "#{secs} seconds"
    end
  end
end
like image 171
Michael Richards Avatar answered Nov 04 '22 08:11

Michael Richards


Have a look at the Rails DateHelper.distance_of_time_in_words method. It will give you a great starting place. Despite being loaded with magic numbers, the approach should work for you.

like image 4
EmFi Avatar answered Nov 04 '22 10:11

EmFi