Timeago.rb

From EggeWiki

Here's yet another timeago function which I found, for those who don't want to include a full Rails framework in your Ruby script. Sorry - I don't remember where I copied this function from.

<geshi lang="ruby"> def pluralize(count, s)

 if count == 1 then
   count.to_s + ' ' + s
 else
   count.to_s + ' ' + s + 's'
 end

end

  1. options
  2. :start_date, sets the time to measure against, defaults to now
  3. :later, changes the adjective and measures time forward
  4. :round, sets the unit of measure 1 = seconds, 2 = minutes, 3 hours, 4 days, 5 weeks, 6 months, 7 years (yuck!)
  5. :max_seconds, sets the maximimum practical number of seconds before just referring to the actual time
  6. :date_format, used with to_formatted_s

def timeago(original, options = {})

 start_date = options.delete(:start_date) || Time.now
 later = options.delete(:later) || false
 round = options.delete(:round) || 7
 max_seconds = options.delete(:max_seconds) || 32556926
 date_format = options.delete(:date_format) || :default
 # array of time period chunks
 chunks = [
   [60 * 60 * 24 * 365 , "year"],
   [60 * 60 * 24 * 30 , "month"],
   [60 * 60 * 24 * 7, "week"],
   [60 * 60 * 24 , "day"],
   [60 * 60 , "hour"],
   [60 , "minute"],
   [1 , "second"]
 ]
 if later
   since = original.to_i - start_date.to_i
 else
   since = start_date.to_i - original.to_i
 end
 time = []
 if since < max_seconds
   # Loop trough all the chunks
   totaltime = 0
   for chunk in chunks[0..round]
     seconds    = chunk[0]
     name       = chunk[1]
     count = ((since - totaltime) / seconds).floor
     time << pluralize(count, name) unless count == 0
     if time.size == 2 then
       break
     end
     totaltime += count * seconds
   end
   if time.empty?
     "less than a #{chunks[round-1][1]} ago"
   else
     "#{time.join(', ')} #{later ? 'later' : 'ago'}"
   end
 else
   original.to_formatted_s(date_format)
 end

end

</geshi>