Time#round in 1.9

I

Intransition

Anyone know about Time#round in 1.9. Apparently it exists but it seems
to do nothing but eat up cpu cycles.

ruby-1.9.2-p0 > t = Time.new
=> 2010-08-30 14:34:03 -0400
ruby-1.9.2-p0 > t.round(100000)
=> 2010-08-30 14:34:03 -0400
ruby-1.9.2-p0 > t.round(1000000)
=> 2010-08-30 14:34:03 -0400
 
K

Kirk Haines

Anyone know about Time#round in 1.9. Apparently it exists but it seems
to do nothing but eat up cpu cycles.

=A0ruby-1.9.2-p0 > t =3D Time.new
=A0 =3D> 2010-08-30 14:34:03 -0400
=A0ruby-1.9.2-p0 > t.round(100000)
=A0 =3D> 2010-08-30 14:34:03 -0400
=A0ruby-1.9.2-p0 > t.round(1000000)
=A0 =3D> 2010-08-30 14:34:03 -0400

A voice was heard to utter: "Use the source, Luke! Errr, uh, Trans.
Oh, and the docs!"

/*
* call-seq:
* time.round([ndigits]) -> new_time
*
* Rounds sub seconds to a given precision in decimal digits (0 digits
by default).
* It returns a new time object.
* _ndigits_ should be zero or positive integer.
*
* require 'time'
*
* t =3D Time.utc(2010,3,30, 5,43,"25.123456789".to_r)
* p t.iso8601(10) #=3D> "2010-03-30T05:43:25.1234567890Z"
* p t.round.iso8601(10) #=3D> "2010-03-30T05:43:25.0000000000Z"
* p t.round(0).iso8601(10) #=3D> "2010-03-30T05:43:25.0000000000Z"
* p t.round(1).iso8601(10) #=3D> "2010-03-30T05:43:25.1000000000Z"
* p t.round(2).iso8601(10) #=3D> "2010-03-30T05:43:25.1200000000Z"
* p t.round(3).iso8601(10) #=3D> "2010-03-30T05:43:25.1230000000Z"
* p t.round(4).iso8601(10) #=3D> "2010-03-30T05:43:25.1235000000Z"
* p t.round(5).iso8601(10) #=3D> "2010-03-30T05:43:25.1234600000Z"
* p t.round(6).iso8601(10) #=3D> "2010-03-30T05:43:25.1234570000Z"
* p t.round(7).iso8601(10) #=3D> "2010-03-30T05:43:25.1234568000Z"
* p t.round(8).iso8601(10) #=3D> "2010-03-30T05:43:25.1234567900Z"
* p t.round(9).iso8601(10) #=3D> "2010-03-30T05:43:25.1234567890Z"
* p t.round(10).iso8601(10) #=3D> "2010-03-30T05:43:25.1234567890Z"
*
* t =3D Time.utc(1999,12,31, 23,59,59)
* p((t + 0.4).round.iso8601(3)) #=3D> "1999-12-31T23:59:59.000Z"
* p((t + 0.49).round.iso8601(3)) #=3D> "1999-12-31T23:59:59.000Z"
* p((t + 0.5).round.iso8601(3)) #=3D> "2000-01-01T00:00:00.000Z"
* p((t + 1.4).round.iso8601(3)) #=3D> "2000-01-01T00:00:00.000Z"
* p((t + 1.49).round.iso8601(3)) #=3D> "2000-01-01T00:00:00.000Z"
* p((t + 1.5).round.iso8601(3)) #=3D> "2000-01-01T00:00:01.000Z"
*
* t =3D Time.utc(1999,12,31, 23,59,59)
* p (t + 0.123456789).round(4).iso8601(6) #=3D>
"1999-12-31T23:59:59.123500Z"
*/

Below that is a short, simple to follow implementation. You are
telling it to round to 100000 or 1000000 digits. That's probably not
what you mean?


Kirk Haines
 
I

Intransition

A voice was heard to utter: "Use the source, Luke! Errr, uh, Trans.
Oh, and the docs!"

The docs would be nice, but ri has been broken for months[1] and I
could not find any mention of the method online.

But you are right I could have checked the source.
/*
=A0* call-seq:
=A0* =A0 time.round([ndigits]) =A0 -> new_time
=A0*
=A0* Rounds sub seconds to a given precision in decimal digits (0 digits
by default).
=A0* It returns a new time object.
=A0* _ndigits_ should be zero or positive integer.
=A0*
=A0* =A0 =A0 require 'time'
=A0*
=A0* =A0 =A0 t =3D Time.utc(2010,3,30, 5,43,"25.123456789".to_r)
=A0* =A0 =A0 p t.iso8601(10) =A0 =A0 =A0 =A0 =A0 #=3D> "2010-03-30T05:43:= 25.1234567890Z"
=A0* =A0 =A0 p t.round.iso8601(10) =A0 =A0 #=3D> "2010-03-30T05:43:25.000= 0000000Z"
=A0* =A0 =A0 p t.round(0).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.00000= 00000Z"
=A0* =A0 =A0 p t.round(1).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.10000= 00000Z"
=A0* =A0 =A0 p t.round(2).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12000= 00000Z"
=A0* =A0 =A0 p t.round(3).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12300= 00000Z"
=A0* =A0 =A0 p t.round(4).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12350= 00000Z"
=A0* =A0 =A0 p t.round(5).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12346= 00000Z"
=A0* =A0 =A0 p t.round(6).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12345= 70000Z"
=A0* =A0 =A0 p t.round(7).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12345= 68000Z"
=A0* =A0 =A0 p t.round(8).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12345= 67900Z"
=A0* =A0 =A0 p t.round(9).iso8601(10) =A0#=3D> "2010-03-30T05:43:25.12345= 67890Z"
=A0* =A0 =A0 p t.round(10).iso8601(10) #=3D> "2010-03-30T05:43:25.1234567= 890Z"
=A0*
=A0* =A0 =A0 t =3D Time.utc(1999,12,31, 23,59,59)
=A0* =A0 =A0 p((t + 0.4).round.iso8601(3)) =A0 =A0#=3D> "1999-12-31T23:59= :59.000Z"
=A0* =A0 =A0 p((t + 0.49).round.iso8601(3)) =A0 #=3D> "1999-12-31T23:59:5= 9.000Z"
=A0* =A0 =A0 p((t + 0.5).round.iso8601(3)) =A0 =A0#=3D> "2000-01-01T00:00= :00.000Z"
=A0* =A0 =A0 p((t + 1.4).round.iso8601(3)) =A0 =A0#=3D> "2000-01-01T00:00= :00.000Z"
=A0* =A0 =A0 p((t + 1.49).round.iso8601(3)) =A0 #=3D> "2000-01-01T00:00:0= 0.000Z"
=A0* =A0 =A0 p((t + 1.5).round.iso8601(3)) =A0 =A0#=3D> "2000-01-01T00:00= :01.000Z"
=A0*
=A0* =A0 =A0 t =3D Time.utc(1999,12,31, 23,59,59)
=A0* =A0 =A0 p (t + 0.123456789).round(4).iso8601(6) =A0#=3D>
"1999-12-31T23:59:59.123500Z"
=A0*/

Below that is a short, simple to follow implementation. =A0You are
telling it to round to 100000 or 1000000 digits. That's probably not
what you mean?

I see, so it only rounds sub-seconds per digit. That's too bad,
Facets' #round method could round to any second. I have to rename.

Thanks.

[1] /home/trans/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/rdoc/ri/
driver.rb:909:in `load_method': undefined method `[]' for nil:NilClass
(NoMethodError)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,145
Messages
2,570,828
Members
47,374
Latest member
anuragag27

Latest Threads

Top