Skip to content

Commit

Permalink
Merge pull request rails#410 from asanghi/LH6074
Browse files Browse the repository at this point in the history
distance_of_time_in_words calculates wrong no of years
  • Loading branch information
josevalim committed May 6, 2011
2 parents 29dbccf + 65a9563 commit be9857c
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
17 changes: 14 additions & 3 deletions actionpack/lib/action_view/helpers/date_helper.rb
Expand Up @@ -94,9 +94,20 @@ def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, o
when 43200..86399 then locale.t :about_x_months, :count => 1
when 86400..525599 then locale.t :x_months, :count => (distance_in_minutes.to_f / 43200.0).round
else
distance_in_years = distance_in_minutes / 525600
minute_offset_for_leap_year = (distance_in_years / 4) * 1440
remainder = ((distance_in_minutes - minute_offset_for_leap_year) % 525600)
fyear = from_time.year
fyear += 1 if from_time.month >= 3
tyear = to_time.year
tyear -= 1 if to_time.month < 3
leap_years = (fyear > tyear) ? 0 : (fyear..tyear).count{|x| Date.leap?(x)}
minute_offset_for_leap_year = leap_years * 1440
# Discount the leap year days when calculating year distance.
# e.g. if there are 20 leap year days between 2 dates having the same day
# and month then the based on 365 days calculation
# the distance in years will come out to over 80 years when in written
# english it would read better as about 80 years.
minutes_with_offset = distance_in_minutes - minute_offset_for_leap_year
remainder = (minutes_with_offset % 525600)
distance_in_years = (minutes_with_offset / 525600)
if remainder < 131400
locale.t(:about_x_years, :count => distance_in_years)
elsif remainder < 394200
Expand Down
4 changes: 4 additions & 0 deletions actionpack/test/template/date_helper_test.rb
Expand Up @@ -121,6 +121,10 @@ def test_distance_in_words_with_dates
start_date = Date.new 1975, 1, 31
end_date = Date.new 1977, 1, 31
assert_equal("about 2 years", distance_of_time_in_words(start_date, end_date))

start_date = Date.new 1982, 12, 3
end_date = Date.new 2010, 11, 30
assert_equal("almost 28 years", distance_of_time_in_words(start_date, end_date))
end

def test_distance_in_words_with_integers
Expand Down

0 comments on commit be9857c

Please sign in to comment.