How do you say something happened "x minutes ago" or "x hours ago" or "x days ago" in Ruby?

If I have a time variable in Ruby, how can I say that it refers to an event that happened one of the following:

"x minutes ago" or "x hours ago" or "x days ago"

Obviously, if something happened 2 days ago, I would not want to say that it happened so-and-so minutes ago.

+4
ruby formatting time
source share
4 answers

If you are on rails:

time_ago_in_words 
+11
source share

Here is the language agnostic version that you should be able to convert to any language:

 ONE_MINUTE = 60 ONE_HOUR = 60 * ONE_MINUTE ONE_DAY = 24 * ONE_HOUR ONE_WEEK = 7 * ONE_DAY ONE_MONTH = ONE_DAY * 3652425 / 120000 ONE_YEAR = ONE_DAY * 3652425 / 10000 def when(then): seconds_ago = now() - then if seconds_ago < 0: return "at some point in the future (???)" if seconds_ago == 0: return "now" if seconds_ago == 1: return "1 second ago" if seconds_ago < ONE_MINUTE: return str(seconds_ago) + " seconds ago" if seconds_ago < 2 * ONE_MINUTE: return "1 minute ago" if seconds_ago < ONE_HOUR: return str(seconds_ago/ONE_MINUTE) + " minutes ago" if seconds_ago < 2 * ONE_HOUR: return "1 hour ago" if seconds_ago < ONE_DAY: return str(seconds_ago/ONE_HOUR) + " hours ago" if seconds_ago < 2 * ONE_DAY: return "1 day ago" if seconds_ago < ONE_WEEK: return str(seconds_ago/ONE_DAY) + " days ago" if seconds_ago < 2 * ONE_WEEK: return "1 week ago" if seconds_ago < ONE_MONTH: return str(seconds_ago/ONE_WEEK) + " weeks ago" if seconds_ago < 2 * ONE_MONTH: return "1 month ago" if seconds_ago < ONE_YEAR: return str(seconds_ago/ONE_MONTH) + " months ago" if seconds_ago < 2 * ONE_YEAR: return "1 year ago" return str(seconds_ago/ONE_YEAR) + " years ago" 

Please note that year / month figures are approximate (based on average values), but this does not really matter since the relative error will still be very low.

+12
source share

You need to do something like this:

 tnow = Time.now elapsed = tnow - tevent # elapsed time in seconds if (elapsed < 60) puts "#{elapsed} seconds ago" elsif (elapsed < 60*60) puts "#{elapsed/60} minutes ago" end 
0
source share

Here is a complete example if you decide to go beyond full Rails but are ready to use active_support ( gem install actionview )

 #!/usr/bin/env ruby require 'active_support' require 'active_support/core_ext/object/acts_like' require 'active_support/core_ext/time/acts_like' require 'action_view' require 'date' # Avoid a deprecation warning I18n.enforce_available_locales = false # Add time_ago_in_words extend ActionView::Helpers::DateHelper [ '2014-04-24 16:20:00', '2014-04-21 16:20:00', '2014-03-24 16:20:00', '2013-04-20 16:20:00', ].map {|t| DateTime.parse t}.each do |time| puts time_ago_in_words time end 

At the time of recording, these outputs:

 about 6 hours 3 days about 1 month about 1 year 
0
source share

All Articles