# Can Ruby print out time difference (duration) readily?

**URL:** <https://www.ruby-forum.com/t/can-ruby-print-out-time-difference-duration-readily/178484>\
**Category:** Ruby\
**Created:** [November 5, 2009, 10:09am UTC](https://www.ruby-forum.com/t/can-ruby-print-out-time-difference-duration-readily/178484 "2009-11-05T10:09:45Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![winterheat](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/7993a0/32.png) [@winterheat](https://www.ruby-forum.com/u/winterheat)\
**Post date:** [November 5, 2009, 10:09am UTC](https://www.ruby-forum.com/t/can-ruby-print-out-time-difference-duration-readily/178484/1 "2009-11-05T10:09:45Z")

</div>

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”  
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)

---

<div class="post-metadata">

**Author:** ![winterheat](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/7993a0/32.png) [@winterheat](https://www.ruby-forum.com/u/winterheat)\
**Post date:** [November 5, 2009, 11:26am UTC](https://www.ruby-forum.com/t/can-ruby-print-out-time-difference-duration-readily/178484/2 "2009-11-05T11:26:35Z")

</div>

> 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)

You can try something like below (change with conditional statements to  
fit your requirements of upto 2 numbers):

class Time  
def duration  
Time.now - self  
end  
def duration\_string  
difference = duration  
days = (difference/(3600_24)).to\_i  
hours = ((difference%(3600_24))/3600).to\_i

```
mins = ((difference%(3600))/60).to_i

secs = (difference%60).to_i
"#{days} days, #{hours} hours, #{mins} minutes and #{secs} seconds"

```

end  
end

start = Time.new  
sleep(5)  
puts start.duration\_string

---

<div class="post-metadata">

**Author:** ![winterheat](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/7993a0/32.png) [@winterheat](https://www.ruby-forum.com/u/winterheat)\
**Post date:** [November 9, 2009, 2:36am UTC](https://www.ruby-forum.com/t/can-ruby-print-out-time-difference-duration-readily/178484/3 "2009-11-09T02:36:49Z")

</div>

On Nov 5, 4:09 am, Jian L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 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)

RichUnits also has a duration class. You can tell it what time  
segments you want to use.

---

<div class="post-metadata">

**Author:** ![winterheat](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/7993a0/32.png) [@winterheat](https://www.ruby-forum.com/u/winterheat)\
**Post date:** [November 9, 2009, 4:52am UTC](https://www.ruby-forum.com/t/can-ruby-print-out-time-difference-duration-readily/178484/4 "2009-11-09T04:52:03Z")

</div>

On Nov 5, 2:09 am, Jian L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> and similarly, report
> 
> 23 minutes and 35 seconds  
> 1 hour and 33 minutes  
> 2 days and 3 hours

This old thread discusses a similar topic.  
[http://groups.google.com/group/comp.lang.ruby/browse\_thread/thread/e51d23dadacc03fa](http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/e51d23dadacc03fa)

Note that durations expressed in any unit greater than weeks (months,  
years, etc.) are going to give you problems.

---

<div class="post-metadata">

**Author:** ![winterheat](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/7993a0/32.png) [@winterheat](https://www.ruby-forum.com/u/winterheat)\
**Post date:** [November 9, 2009, 1:55am UTC](https://www.ruby-forum.com/t/can-ruby-print-out-time-difference-duration-readily/178484/5 "2009-11-09T01:55:50Z")

</div>

On Nov 5, 4:09 am, Jian L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 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”

require ‘chronic\_duration’  
ChronicDuration.output(Time.now - start, :format =\> :long)

# =\> “2 minutes 23 seconds”

See [GitHub - henrypoydar/chronic\_duration: A simple Ruby natural language parser for elapsed time](http://github.com/hpoydar/chronic_duration)
