diff --git a/config/initializers/date_ext.rb b/config/initializers/date_ext.rb new file mode 100644 index 000000000..15055c3cb --- /dev/null +++ b/config/initializers/date_ext.rb @@ -0,0 +1 @@ +require 'date_ext' diff --git a/lib/date_ext.rb b/lib/date_ext.rb new file mode 100644 index 000000000..beae11125 --- /dev/null +++ b/lib/date_ext.rb @@ -0,0 +1,8 @@ +module AgeInYears + def age_in_years(now = Time.now.utc.to_date) + # reference: http://stackoverflow.com/questions/819263/get-persons-age-in-ruby#comment21200772_819263 + now.year - year - ((now.month > month || (now.month == month && now.day >= day)) ? 0 : 1) + end +end + +Date.include(AgeInYears) diff --git a/spec/lib/date_spec.rb b/spec/lib/date_spec.rb new file mode 100644 index 000000000..0963306e3 --- /dev/null +++ b/spec/lib/date_spec.rb @@ -0,0 +1,55 @@ +require 'rails_helper' + +describe Date do + describe '#age_in_years' do + it "calculates age correctly for common dates" do + d = Date.new(1980, 3, 13) + expect(d.age_in_years(Date.new(2000, 3, 12))).to eq(19) + expect(d.age_in_years(Date.new(2000, 3, 13))).to eq(20) + expect(d.age_in_years(Date.new(2000, 3, 14))).to eq(20) + end + + it "calculates age correctly for people born near a year's limit" do + d = Date.new(1980, 12, 31) + expect(d.age_in_years(Date.new(2000, 12, 30))).to eq(19) + expect(d.age_in_years(Date.new(2000, 12, 31))).to eq(20) + expect(d.age_in_years(Date.new(2001, 1, 1))).to eq(20) + + d = Date.new(1980, 1, 1) + expect(d.age_in_years(Date.new(2000, 12, 31))).to eq(20) + expect(d.age_in_years(Date.new(2001, 1, 1))).to eq(21) + expect(d.age_in_years(Date.new(2001, 1, 2))).to eq(21) + end + + it "calculates age correctly for people born around February the 29th" do + # 1980 and 2000 are leap years. 2001 is a regular year + d = Date.new(1980, 2, 29) + expect(d.age_in_years(Date.new(2000, 2, 27))).to eq(19) + expect(d.age_in_years(Date.new(2000, 2, 28))).to eq(19) + expect(d.age_in_years(Date.new(2000, 2, 29))).to eq(20) + expect(d.age_in_years(Date.new(2000, 3, 1))).to eq(20) + expect(d.age_in_years(Date.new(2001, 2, 27))).to eq(20) + expect(d.age_in_years(Date.new(2001, 2, 28))).to eq(20) + expect(d.age_in_years(Date.new(2001, 3, 1))).to eq(21) + + d = Date.new(1980, 2, 28) + expect(d.age_in_years(Date.new(2000, 2, 27))).to eq(19) + expect(d.age_in_years(Date.new(2000, 2, 28))).to eq(20) + expect(d.age_in_years(Date.new(2000, 2, 29))).to eq(20) + expect(d.age_in_years(Date.new(2000, 3, 1))).to eq(20) + expect(d.age_in_years(Date.new(2001, 2, 27))).to eq(20) + expect(d.age_in_years(Date.new(2001, 2, 28))).to eq(21) + expect(d.age_in_years(Date.new(2001, 3, 1))).to eq(21) + + d = Date.new(1980, 3, 1) + expect(d.age_in_years(Date.new(2000, 2, 27))).to eq(19) + expect(d.age_in_years(Date.new(2000, 2, 28))).to eq(19) + expect(d.age_in_years(Date.new(2000, 2, 29))).to eq(19) + expect(d.age_in_years(Date.new(2000, 3, 1))).to eq(20) + expect(d.age_in_years(Date.new(2001, 2, 27))).to eq(20) + expect(d.age_in_years(Date.new(2001, 2, 28))).to eq(20) + expect(d.age_in_years(Date.new(2001, 3, 1))).to eq(21) + end + + end +end