On Wed, 18 Jan 2006, David C. 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