Forum: Ruby Time Diff Module

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Bd6167863690cb320d65bb9204619817?d=identicon&s=25 David Clements (Guest)
on 2006-01-17 18:25
(Received via mailing list)
Anyone know of a module out there that will encapsulate differences in
time?

Ideally I would want something like this:

d1 = DateTime.now + 2.hours + 2.minutes
d2 = DateTime.now

diff = d1-d2


puts "Diff:  #{diff.hours}:#{diff.minutes}"


>> Diff: 2:02

I have searched for examples and all of them seem to be doing this
manually.

Dave
25e11a00a89683f7e01e425a1a6e305c?d=identicon&s=25 Wilson Bilkovich (Guest)
on 2006-01-17 18:37
(Received via mailing list)
On 1/17/06, David Clements <digidigo@gmail.com> wrote:
> puts "Diff:  #{diff.hours}:#{diff.minutes}"
>
>
> >> Diff: 2:02
>
> I have searched for examples and all of them seem to be doing this manually.
>
> Dave

Runt may have what you're looking for:
http://runt.rubyforge.org/

Tutorial:
http://runt.rubyforge.org/doc/files/doc/tutorial_t...
9d4ec8946f933a18a1d15b094cc3c425?d=identicon&s=25 Jonathan Leighton (Guest)
on 2006-01-17 18:40
(Received via mailing list)
On Wed, 2006-01-18 at 01:48 +0900, David Clements wrote:
> puts "Diff:  #{diff.hours}:#{diff.minutes}"
>
>
> >> Diff: 2:02
>
> I have searched for examples and all of them seem to be doing this manually.
>
> Dave

Ruby on Rails' ActiveSupport::CoreExtensions::Numeric::Time module
supports this. The gem is activesupport. You might want to extract it
somehow to avoid getting the rest of the library if you don't need it.

Jon
Cb48ca5059faf7409a5ab3745a964696?d=identicon&s=25 unknown (Guest)
on 2006-01-17 23:05
(Received via mailing list)
On Wed, 18 Jan 2006, David Clements wrote:

> puts "Diff:  #{diff.hours}:#{diff.minutes}"
>
>
>>> Diff: 2:02
>
> I have searched for examples and all of them seem to be doing this manually.

i'm guessing the reason this has not been done generically is that it is
incredibly slippery.  for instance, if i had

   a = DateTime::new 1582, 8, 4
   b = a + 1.day

then b should the the day '1582-08-15'.  and

   diff = b - a
   p diff.days

should output either 10 or 1 - depending on how you look at it.

the reason is the fact that DateTime makes all the calender reforms
between
julian and gregorian transparent and even handles them based on
timezone.  not
saying it could not be done, but it's tough and, afaik, hasn't been.
see
ruby-1.8.4/lib/date.rb for details.

of course, activesupport give you Numeric#days, etc, but that is quite
easy to
roll.

if the code you posted is pretty close you what you actually need then
why not
simply use Time objects, converting to DateTime as needed using
DateTime::new(t.year, t.month, t.day... etc)?

     harp:~ > cat a.rb
     class Time
       module Units
         def __less__() "/" end
         def __more__() "*" end
         def milliseconds() self.send(__less__,1000) end; alias_method
"millisecond", "milliseconds"
         def seconds() self end; alias_method "second", "seconds"
         def minutes() seconds.send(__more__,60) end; alias_method
"minute", "minutes"
         def hours() minutes.send(__more__,60) end; alias_method "hour",
"hours"
         def days() hours.send(__more__,24) end; alias_method "day",
"days"
         def weeks() days.send(__more__,7) end; alias_method "week",
"weeks"
         def months() weeks.send(__more__,4) end; alias_method "month",
"months"
         def years() months.send(__more__,12) end; alias_method "year",
"years"
         def decades() years.send(__more__,10) end; alias_method
"decade", "decades"
         def centuries() decades.send(__more__,10) end; alias_method
"century", "centuries"
       end
       module DiffUnits
         include ::Time::Units
         def __less__() "*" end
         def __more__() "/" end
       end
       alias_method "__delta__", "-"
       def - other
         ret = __delta__ other
         ret.extend DiffUnits
         ret
       end
     end
     class Numeric
       include ::Time::Units
     end

     now = Time::now
     a = now
     b = now + 2.hours + 2.minutes
     d = b - a

     require "yaml"
     %w( seconds minutes hours days ).each{|m| y m => d.send(m)}


     harp:~ > ruby a.rb
     ---
     seconds: 7320.0
     ---
     minutes: 122.0
     ---
     hours: 2.03333333333333
     ---
     days: 0.0847222222222222


hmmm.  maybe i'll add this to alib...

cheers.

-a
B0dfbb957a5df608772f74add7e62df1?d=identicon&s=25 ABHILASH M.A (abhidsm)
on 2011-03-09 17:02
David Clements wrote in post #23880:
> Anyone know of a module out there that will encapsulate differences in
> time?
>
> Ideally I would want something like this:
>
> d1 = DateTime.now + 2.hours + 2.minutes
> d2 = DateTime.now
>
> diff = d1-d2
>
>
> puts "Diff:  #{diff.hours}:#{diff.minutes}"
>
>
>>> Diff: 2:02
>
> I have searched for examples and all of them seem to be doing this
> manually.
>
> Dave

There is a gem available to find the difference in a useful way.

https://rubygems.org/gems/time_diff

This will return a hash of difference in year, month, week, day, hour,
minute, second
This topic is locked and can not be replied to.