Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to calculate how many years passed since a given date in Ruby?

Tags:

This question was here for other languages, so let here be one for Ruby.

How do I calculate number of complete years that have passed from a given date? As you probably have guessed, that's to calculate person's age automatically. The closest one is distance_of_time_in_words Rails helper, so the following template

Jack is <%= distance_of_time_in_words (Time.now, Time.local(1950,03,22)) %> old. 

yields

Jack is over 59 years old. 

But I need more precise function that yields just number. Is there one?

If there exists some kind of Ruby on Rails helper function for this, this is OK, although pure Ruby solution would be better.

Edit: the gist of the question is that a non-approximate solution is needed. At the 2nd of March Jack should be 59 years old and the next day he should be 60 years old. Leap years and such should be taken into account.

like image 484
P Shved Avatar asked Dec 14 '09 22:12

P Shved


2 Answers

Do you want age as people typically understand it, or are you looking for a precise measure of time elapsed? If the former, there is no need to worry about leap years and other complications. You simply need to compute a difference in years and reduce it if the person has not had a birthday yet this year. If the latter, you can convert seconds elapsed into years, as other answers have suggested.

def age_in_completed_years (bd, d)     # Difference in years, less one if you have not had a birthday this year.     a = d.year - bd.year     a = a - 1 if (          bd.month >  d.month or          (bd.month >= d.month and bd.day > d.day)     )     a end  birthdate = Date.new(2000, 12, 15) today     = Date.new(2009, 12, 14)  puts age_in_completed_years(birthdate, today) 
like image 74
FMc Avatar answered Nov 08 '22 03:11

FMc


require 'date'  def years_since(dt)     delta = (Date.today - Date.parse(dt)) / 365     delta.to_i end 
like image 28
sh-beta Avatar answered Nov 08 '22 04:11

sh-beta