Daniel DeLorme
9/6/2006 9:03:00 AM
Brad Tilley wrote:
> Say I have two time objects represented as floats like so:
>
> x = 64299600.0
> y = 1157489583.2798
>
> I want to subtract x from y and then represent the difference as years,
> months, days, hours, minutes and seconds.
>
> I don't see how the Time library would do this. Has anyone done
> something like this? If so, how?
This may not be exactly what you had in mind, but it's better than the other
proposed "solutions" when it comes to displaying the number of months or years
between two dates: (uses rails activesupport)
class Time
def time_span(other = nil)
other ||= self.utc? ? Time.now.utc : Time.now
other.time_spent(self)
end
def time_spent(other = nil)
other ||= self.utc? ? Time.now.utc : Time.now
n = other - self
case n.abs
when 0...60 #1.minute
"%d seconds" % n
when 0...3600 #1.hour
"%.1f minutes" % (n / 60)
when 0...86400 #1.day
"%.1f hours" % (n / 3600)
else
sign = "-" if self > other
t1,t2 = [other,self].sort
if t2.year != t1.year and t2 >= t1.advance(:years=>1)
nb_years = t2.year - t1.year
t = t1.advance(:years => nb_years)
t = t1.advance(:years => (nb_years -= 1)) if t > t2
"#{sign}%.1f years" % (nb_years + (t2 - t).to_f / (t.advance(:years=>1)
- t))
elsif t2 >= t1.advance(:months=>1)
nb_months = (t1.year==t2.year ? 0 : 12) + t2.month - t1.month
t = t1.advance(:months => nb_months)
t = t1.advance(:months => (nb_months -= 1)) if t > t2
"#{sign}%.1f months" % (nb_months + (t2 - t).to_f /
(t.advance(:months=>1) - t))
else
"%.1f days" % (n / 1.0.day)
end
end
end
end
>> t.time_span(t - 26.seconds)
=> "26 seconds"
>> t.time_span(t - 26.hours)
=> "1.1 days"
>> t.time_span(t - 26.days)
=> "26.0 days"
>> t.time_span(t - 26.months)
=> "2.1 years"