Eric Wright Eric Wright - 11 months ago 58
Ruby Question

In Rails, display time between two dates in English

In a Rails project I want to find the difference between two dates and then display it in natural language. Something like

>> (date1 - date2).to_natural_language
"3 years, 2 months, 1 week, 6 days"

Basically this for ruby.

Google and the Rails API haven't turned up anything. I've found some things that will give you the difference in one unit (ie, how many weeks between two dates) but not something that will accurately calculate years, months, weeks, days all together.

Answer Source

The other answers may not give the type of output that you're looking for, because instead of giving a string of years, months, etc., the Rails helpers just show the largest unit. If you're looking for something more broken down, here's another option. Stick this method into a helper:

def time_diff_in_natural_language(from_time, to_time)
  from_time = from_time.to_time if from_time.respond_to?(:to_time)
  to_time = to_time.to_time if to_time.respond_to?(:to_time)
  distance_in_seconds = ((to_time - from_time).abs).round
  components = []

  %w(year month week day).each do |interval|
    # For each interval type, if the amount of time remaining is greater than
    # one unit, calculate how many units fit into the remaining time.
    if distance_in_seconds >= 1.send(interval)
      delta = (distance_in_seconds / 1.send(interval)).floor
      distance_in_seconds -= delta.send(interval)
      components << pluralize(delta, interval)

  components.join(", ")

And then in a view you can say something like:

<%= time_diff_in_natural_language(, 2.5.years.ago) %>
=> 2 years, 6 months, 2 days

The given method only goes down to days, but can be easily extended to add in smaller units if desired.