# How to time something?

**URL:** <https://www.ruby-forum.com/t/how-to-time-something/179125>\
**Category:** Ruby\
**Created:** [November 18, 2009, 4:52am UTC](https://www.ruby-forum.com/t/how-to-time-something/179125 "2009-11-18T04:52:33Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![bguan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/8edcca/32.png) [@bguan](https://www.ruby-forum.com/u/bguan)\
**Post date:** [November 18, 2009, 4:52am UTC](https://www.ruby-forum.com/t/how-to-time-something/179125/1 "2009-11-18T04:52:33Z")

</div>

Heres what I have right now but it does reset the sec. to zero it keeps  
going 61…62

def seconds\_minutes\_string(seconds\_elapsed)  
seconds = seconds\_elapsed % 59  
minutes = seconds / 60  
return minutes.to\_s + ‘:’ + seconds.to\_s  
end

---

<div class="post-metadata">

**Author:** ![bguan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/8edcca/32.png) [@bguan](https://www.ruby-forum.com/u/bguan)\
**Post date:** [November 18, 2009, 4:52am UTC](https://www.ruby-forum.com/t/how-to-time-something/179125/2 "2009-11-18T04:52:54Z")

</div>

Brian G. wrote:

> Heres what I have right now but it does reset the sec. to zero it keeps  
> going 61…62 how can I add more stuff reset it
> 
> def seconds\_minutes\_string(seconds\_elapsed)  
> seconds = seconds\_elapsed % 59  
> minutes = seconds / 60  
> return minutes.to\_s + ‘:’ + seconds.to\_s  
> end

---

<div class="post-metadata">

**Author:** ![bguan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/8edcca/32.png) [@bguan](https://www.ruby-forum.com/u/bguan)\
**Post date:** [November 18, 2009, 5:10am UTC](https://www.ruby-forum.com/t/how-to-time-something/179125/3 "2009-11-18T05:10:36Z")

</div>

Brian G. wrote:

> Heres what I have right now but it does reset the sec. to zero it keeps  
> going 61…62
> 
> def seconds\_minutes\_string(seconds\_elapsed)  
> seconds = seconds\_elapsed % 59  
> minutes = seconds / 60  
> return minutes.to\_s + ‘:’ + seconds.to\_s  
> end

Shouldn’t your modulus be 60 instead of 59 and shouldn’t the minutes be  
the seconds\_elapsed divided by 60?

---

<div class="post-metadata">

**Author:** ![bguan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/8edcca/32.png) [@bguan](https://www.ruby-forum.com/u/bguan)\
**Post date:** [November 18, 2009, 5:25am UTC](https://www.ruby-forum.com/t/how-to-time-something/179125/4 "2009-11-18T05:25:49Z")

</div>

On Tue, Nov 17, 2009 at 10:53 PM, Brian G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Heres what I have right now but it does reset the sec. to zero it keeps  
> going 61…62
> 
> def seconds\_minutes\_string(seconds\_elapsed)  
> seconds = seconds\_elapsed % 59  
> minutes = seconds / 60  
> return minutes.to\_s + ‘:’ + seconds.to\_s  
> end

I’m not sure what you mean that "it doesn’t reset the sec to zero

def seconds\_minutes\_string(seconds\_elapsed)  
seconds = seconds\_elapsed % 59  
minutes = seconds / 60  
return minutes.to\_s + ‘:’ + seconds.to\_s  
end

(55…65).map {|secs| seconds\_minutes\_string(secs)} # =\> [“0:55”,  
“0:56”, “0:57”, “0:58”, “0:0”, “0:1”, “0:2”, “0:3”, “0:4”, “0:5”,  
“0:6”]

This should produce the right strings, I assume you wanted 1:01  
instead of 1:1 for 1 minute and 1 second

def seconds\_minutes\_string(seconds\_elapsed)  
“%d:%02d” % [seconds\_elapsed / 60, seconds\_elapsed % 60]  
end

(55…65).map {|secs| seconds\_minutes\_string(secs)} # =\> [“0:55”,  
“0:56”, “0:57”, “0:58”, “0:59”, “1:00”, “1:01”, “1:02”, “1:03”,  
“1:04”, “1:05”]

–  
Rick DeNatale

Blog: [http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)  
Twitter: [http://twitter.com/RickDeNatale](http://twitter.com/RickDeNatale)  
WWR: [http://www.workingwithrails.com/person/9021-rick-denatale](http://www.workingwithrails.com/person/9021-rick-denatale)  
LinkedIn: [http://www.linkedin.com/in/rickdenatale](http://www.linkedin.com/in/rickdenatale)

---

<div class="post-metadata">

**Author:** ![bguan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/8edcca/32.png) [@bguan](https://www.ruby-forum.com/u/bguan)\
**Post date:** [November 18, 2009, 6:54am UTC](https://www.ruby-forum.com/t/how-to-time-something/179125/5 "2009-11-18T06:54:10Z")

</div>

Brian G.:

> Heres what I have right now but it does  
> reset the sec. to zero it keeps going 61…62

> def seconds\_minutes\_string(seconds\_elapsed)  
> seconds = seconds\_elapsed % 59  
> minutes = seconds / 60  
> return minutes.to\_s + ‘:’ + seconds.to\_s  
> end

First, as Michael pointed out, you probably want to divide modulo 60,  
and you want the minutes to be based on seconds\_elapsed rather than  
seconds.

Second, each time you % and / the same number by the  
same integer, you might want to use Numeric#divmod instead:

def time\_str secs  
secs.divmod(60).join ‘:’  
end

(57…62).map { |secs| time\_str secs }

# =\> [“0:57”, “0:58”, “0:59”, “1:0”, “1:1”, “1:2”]

Third, as Rick pointed out, if you prefer 1:02 to 1:2, you can do this:

def time\_str secs  
‘%d:%02d’ % secs.divmod(60)  
end

(57…62).map { |secs| time\_str secs }

# =\> [“0:57”, “0:58”, “0:59”, “1:00”, “1:01”, “1:02”]

â€” Shot (and, apparently, his ironic signature AI having a good day)
