From: ara.t.howard@... Date: 2006-01-18T06:27:17+09:00 Subject: Re: Time Diff Module On Wed, 18 Jan 2006, David Clements wrote: > 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. 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 -- strong and healthy, who thinks of sickness until it strikes like lightning? preoccupied with the world, who thinks of death, until it arrives like thunder? -- milarepa