<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -26,8 +26,10 @@ module ActionView
       #   47 hrs, 59 mins, 29 secs &lt;-&gt; 29 days, 23 hrs, 59 mins, 29 secs            # =&gt; [2..29] days
       #   29 days, 23 hrs, 59 mins, 30 secs &lt;-&gt; 59 days, 23 hrs, 59 mins, 29 secs   # =&gt; about 1 month
       #   59 days, 23 hrs, 59 mins, 30 secs &lt;-&gt; 1 yr minus 1 sec                    # =&gt; [2..12] months
-      #   1 yr &lt;-&gt; 2 yrs minus 1 secs                                               # =&gt; about 1 year
-      #   2 yrs &lt;-&gt; max time or date                                                # =&gt; over [2..X] years
+      #   1 yr &lt;-&gt; 1 yr, 3 months                                                   # =&gt; about 1 year
+      #   1 yr, 3 months &lt;-&gt; 1 yr, 9 months                                         # =&gt; over 1 year
+      #   1 yr, 9 months &lt;-&gt; 2 yr minus 1 sec                                       # =&gt; almost 2 years
+      #   2 yrs &lt;-&gt; max time or date                                                # =&gt; (same rules as 1 yr)
       #
       # With &lt;tt&gt;include_seconds&lt;/tt&gt; = true and the difference &lt; 1 minute 29 seconds:
       #   0-4   secs      # =&gt; less than 5 seconds
@@ -53,8 +55,8 @@ module ActionView
       #   distance_of_time_in_words(from_time, from_time + 4.years + 9.days + 30.minutes + 5.seconds) # =&gt; about 4 years
       #
       #   to_time = Time.now + 6.years + 19.days
-      #   distance_of_time_in_words(from_time, to_time, true)     # =&gt; over 6 years
-      #   distance_of_time_in_words(to_time, from_time, true)     # =&gt; over 6 years
+      #   distance_of_time_in_words(from_time, to_time, true)     # =&gt; about 6 years
+      #   distance_of_time_in_words(to_time, from_time, true)     # =&gt; about 6 years
       #   distance_of_time_in_words(Time.now, Time.now)           # =&gt; less than a minute
       #
       def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, options = {})
@@ -82,14 +84,21 @@ module ActionView
             when 2..44           then locale.t :x_minutes,      :count =&gt; distance_in_minutes
             when 45..89          then locale.t :about_x_hours,  :count =&gt; 1
             when 90..1439        then locale.t :about_x_hours,  :count =&gt; (distance_in_minutes.to_f / 60.0).round
-            when 1440..2879      then locale.t :x_days,         :count =&gt; 1
-            when 2880..43199     then locale.t :x_days,         :count =&gt; (distance_in_minutes / 1440).round
+            when 1440..2529      then locale.t :x_days,         :count =&gt; 1
+            when 2530..43199     then locale.t :x_days,         :count =&gt; (distance_in_minutes.to_f / 1440.0).round
             when 43200..86399    then locale.t :about_x_months, :count =&gt; 1
-            when 86400..525599   then locale.t :x_months,       :count =&gt; (distance_in_minutes / 43200).round
+            when 86400..525599   then locale.t :x_months,       :count =&gt; (distance_in_minutes.to_f / 43200.0).round
             else
-              return distance_in_minutes % 525600 &lt; 262800 ?
-                     locale.t(:about_x_years, :count =&gt; (distance_in_minutes / 525600).round) :
-                     locale.t(:over_x_years, :count =&gt; (distance_in_minutes / 525600).round)
+              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)
+              if remainder &lt; 131400
+                locale.t(:about_x_years,  :count =&gt; distance_in_years)
+              elsif remainder &lt; 394200
+                locale.t(:over_x_years,   :count =&gt; distance_in_years)
+              else
+                locale.t(:almost_x_years, :count =&gt; distance_in_years + 1)
+              end
           end
         end
       end</diff>
      <filename>actionpack/lib/action_view/helpers/date_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -91,6 +91,9 @@
       over_x_years:
         one:   &quot;over 1 year&quot;
         other: &quot;over {{count}} years&quot;
+      almost_x_years:
+        one:   &quot;almost 1 year&quot;
+        other: &quot;almost {{count}} years&quot;
     prompts:
       year:   &quot;Year&quot;
       month:  &quot;Month&quot;</diff>
      <filename>actionpack/lib/action_view/locale/en.yml</filename>
    </modified>
    <modified>
      <diff>@@ -20,15 +20,16 @@ class DateHelperDistanceOfTimeInWordsI18nTests &lt; Test::Unit::TestCase
       [60.seconds, true]  =&gt; [:'x_minutes',           1],
 
       # without include_seconds
-      [29.seconds, false] =&gt; [:'less_than_x_minutes', 1],
-      [60.seconds, false] =&gt; [:'x_minutes',           1],
-      [44.minutes, false] =&gt; [:'x_minutes',           44],
-      [61.minutes, false] =&gt; [:'about_x_hours',       1],
-      [24.hours,   false] =&gt; [:'x_days',              1],
-      [30.days,    false] =&gt; [:'about_x_months',      1],
-      [60.days,    false] =&gt; [:'x_months',            2],
-      [1.year,     false] =&gt; [:'about_x_years',       1],
-      [3.years,    false] =&gt; [:'over_x_years',        3]
+      [29.seconds,          false] =&gt; [:'less_than_x_minutes', 1],
+      [60.seconds,          false] =&gt; [:'x_minutes',           1],
+      [44.minutes,          false] =&gt; [:'x_minutes',           44],
+      [61.minutes,          false] =&gt; [:'about_x_hours',       1],
+      [24.hours,            false] =&gt; [:'x_days',              1],
+      [30.days,             false] =&gt; [:'about_x_months',      1],
+      [60.days,             false] =&gt; [:'x_months',            2],
+      [1.year,              false] =&gt; [:'about_x_years',       1],
+      [3.years + 6.months,  false] =&gt; [:'over_x_years',        3],
+      [3.years + 10.months, false] =&gt; [:'almost_x_years',      4]
 
       }.each do |passed, expected|
       assert_distance_of_time_in_words_translates_key passed, expected</diff>
      <filename>actionpack/test/template/date_helper_i18n_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -53,13 +53,14 @@ class DateHelperTest &lt; ActionView::TestCase
     assert_equal &quot;about 2 hours&quot;, distance_of_time_in_words(from, to + 89.minutes + 30.seconds)
     assert_equal &quot;about 24 hours&quot;, distance_of_time_in_words(from, to + 23.hours + 59.minutes + 29.seconds)
 
-    # 1440..2879
+    # 1440..2529
     assert_equal &quot;1 day&quot;, distance_of_time_in_words(from, to + 23.hours + 59.minutes + 30.seconds)
-    assert_equal &quot;1 day&quot;, distance_of_time_in_words(from, to + 47.hours + 59.minutes + 29.seconds)
+    assert_equal &quot;1 day&quot;, distance_of_time_in_words(from, to + 41.hours + 59.minutes + 29.seconds)
 
-    # 2880..43199
-    assert_equal &quot;2 days&quot;, distance_of_time_in_words(from, to + 47.hours + 59.minutes + 30.seconds)
-    assert_equal &quot;29 days&quot;, distance_of_time_in_words(from, to + 29.days + 23.hours + 59.minutes + 29.seconds)
+    # 2530..43199
+    assert_equal &quot;2 days&quot;, distance_of_time_in_words(from, to + 42.hours + 59.minutes + 30.seconds)
+    assert_equal &quot;3 days&quot;, distance_of_time_in_words(from, to + 2.days + 12.hours)
+    assert_equal &quot;30 days&quot;, distance_of_time_in_words(from, to + 29.days + 23.hours + 59.minutes + 29.seconds)
 
     # 43200..86399
     assert_equal &quot;about 1 month&quot;, distance_of_time_in_words(from, to + 29.days + 23.hours + 59.minutes + 30.seconds)
@@ -70,13 +71,27 @@ class DateHelperTest &lt; ActionView::TestCase
     assert_equal &quot;12 months&quot;, distance_of_time_in_words(from, to + 1.years - 31.seconds)
 
     # &gt; 525599
-    assert_equal &quot;about 1 year&quot;, distance_of_time_in_words(from, to + 1.years - 30.seconds)
-    assert_equal &quot;about 1 year&quot;, distance_of_time_in_words(from, to + 1.years + 6.months - 1.day)
-    assert_equal &quot;over 1 year&quot;, distance_of_time_in_words(from, to + 1.years + 6.months)
-    assert_equal &quot;about 2 years&quot;, distance_of_time_in_words(from, to + 2.years + 30.seconds)
-    assert_equal &quot;about 5 years&quot;, distance_of_time_in_words(from, to + 5.years + 5.months)
-    assert_equal &quot;over 5 years&quot;, distance_of_time_in_words(from, to + 5.years + 6.months)
-    assert_equal &quot;about 10 years&quot;, distance_of_time_in_words(from, to + 10.years)
+    assert_equal &quot;about 1 year&quot;,    distance_of_time_in_words(from, to + 1.years - 30.seconds)
+    assert_equal &quot;about 1 year&quot;,    distance_of_time_in_words(from, to + 1.years + 3.months - 1.day)
+    assert_equal &quot;over 1 year&quot;,     distance_of_time_in_words(from, to + 1.years + 6.months)
+
+    assert_equal &quot;almost 2 years&quot;,  distance_of_time_in_words(from, to + 2.years - 3.months + 1.day)
+    assert_equal &quot;about 2 years&quot;,   distance_of_time_in_words(from, to + 2.years + 3.months - 1.day)
+    assert_equal &quot;over 2 years&quot;,    distance_of_time_in_words(from, to + 2.years + 3.months + 1.day)
+    assert_equal &quot;over 2 years&quot;,    distance_of_time_in_words(from, to + 2.years + 9.months - 1.day)
+    assert_equal &quot;almost 3 years&quot;,  distance_of_time_in_words(from, to + 2.years + 9.months + 1.day)
+
+    assert_equal &quot;almost 5 years&quot;,  distance_of_time_in_words(from, to + 5.years - 3.months + 1.day)
+    assert_equal &quot;about 5 years&quot;,   distance_of_time_in_words(from, to + 5.years + 3.months - 1.day)
+    assert_equal &quot;over 5 years&quot;,    distance_of_time_in_words(from, to + 5.years + 3.months + 1.day)
+    assert_equal &quot;over 5 years&quot;,    distance_of_time_in_words(from, to + 5.years + 9.months - 1.day)
+    assert_equal &quot;almost 6 years&quot;,  distance_of_time_in_words(from, to + 5.years + 9.months + 1.day)
+
+    assert_equal &quot;almost 10 years&quot;, distance_of_time_in_words(from, to + 10.years - 3.months + 1.day)
+    assert_equal &quot;about 10 years&quot;,  distance_of_time_in_words(from, to + 10.years + 3.months - 1.day)
+    assert_equal &quot;over 10 years&quot;,   distance_of_time_in_words(from, to + 10.years + 3.months + 1.day)
+    assert_equal &quot;over 10 years&quot;,   distance_of_time_in_words(from, to + 10.years + 9.months - 1.day)
+    assert_equal &quot;almost 11 years&quot;, distance_of_time_in_words(from, to + 10.years + 9.months + 1.day)
 
     # test to &lt; from
     assert_equal &quot;about 4 hours&quot;, distance_of_time_in_words(from + 4.hours, to)</diff>
      <filename>actionpack/test/template/date_helper_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8ef1cd9733cd12fc4e5ea25c149956a33fdffa70</id>
    </parent>
  </parents>
  <author>
    <name>John Trupiano</name>
    <login>jtrupiano</login>
    <email>jtrupiano@gmail.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/c9318e9010712aeae33b1dd0e8bed4795ae37caf</url>
  <id>c9318e9010712aeae33b1dd0e8bed4795ae37caf</id>
  <committed-date>2009-09-27T18:37:31-07:00</committed-date>
  <authored-date>2009-09-26T12:42:18-07:00</authored-date>
  <message>Introduce :almost keyword for distance_of_time_in_words. Make 1.75 days - 2 days return '2 days'.

Signed-off-by: Michael Koziarski &lt;michael@koziarski.com&gt;
[#3266 state:committed]</message>
  <tree>140f14f3ec0d5cbe31a5636a431a3908a2b78fef</tree>
  <committer>
    <name>Michael Koziarski</name>
    <login>NZKoz</login>
    <email>michael@koziarski.com</email>
  </committer>
</commit>
