diff options
author | Andrew White <andyw@pixeltrix.co.uk> | 2012-12-04 14:13:15 +0000 |
---|---|---|
committer | Andrew White <andyw@pixeltrix.co.uk> | 2012-12-04 14:21:52 +0000 |
commit | fbf23ed9338f935736dd840ea973fd6372b6ab7d (patch) | |
tree | 30c6f25c3158d979a80bb9ac7582175838b8d568 | |
parent | 18e12273121d5d46be9d87b07cd9935edc58472a (diff) | |
download | rails-fbf23ed9338f935736dd840ea973fd6372b6ab7d.tar.gz rails-fbf23ed9338f935736dd840ea973fd6372b6ab7d.tar.bz2 rails-fbf23ed9338f935736dd840ea973fd6372b6ab7d.zip |
Make distance_of_time_in_words work with DateTime offsets
Because DateTime#to_time returns self when it has a non-zero offset
and subtracting two DateTime instances returns a Rational then the
distance_of_time_in_words methods outputs an incorrect value.
This is fixed in master because we can rely on Ruby 1.9.3's
implementation of to_time but it can't be fixed on Ruby 1.8.7 as
there is no way to map the DateTime to a Time with a non-zero offset.
We can workaround the problem by casting to Float before doing
the subtraction in the distance_of_time_in_words method.
Closes #8390
-rw-r--r-- | actionpack/lib/action_view/helpers/date_helper.rb | 5 | ||||
-rw-r--r-- | actionpack/test/template/date_helper_test.rb | 10 |
2 files changed, 13 insertions, 2 deletions
diff --git a/actionpack/lib/action_view/helpers/date_helper.rb b/actionpack/lib/action_view/helpers/date_helper.rb index e5a27389f1..99aa144d3a 100644 --- a/actionpack/lib/action_view/helpers/date_helper.rb +++ b/actionpack/lib/action_view/helpers/date_helper.rb @@ -71,8 +71,9 @@ module ActionView 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_minutes = (((to_time - from_time).abs)/60.0).round - distance_in_seconds = ((to_time - from_time).abs).round + distance = (to_time.to_f - from_time.to_f).abs + distance_in_minutes = (distance / 60.0).round + distance_in_seconds = distance.round I18n.with_options :locale => options[:locale], :scope => options[:scope] do |locale| case distance_in_minutes diff --git a/actionpack/test/template/date_helper_test.rb b/actionpack/test/template/date_helper_test.rb index dd0aad7119..e4f84f8dd7 100644 --- a/actionpack/test/template/date_helper_test.rb +++ b/actionpack/test/template/date_helper_test.rb @@ -151,6 +151,16 @@ class DateHelperTest < ActionView::TestCase assert_equal "1 minute", distance_of_time_in_words(60.seconds, 0, true) end + def test_distance_in_words_with_offset_datetimes + start_date = DateTime.new 1975, 1, 31, 0, 0, 0, '+6' + end_date = DateTime.new 1977, 1, 31, 0, 0, 0, '+6' + assert_equal("about 2 years", distance_of_time_in_words(start_date, end_date)) + + start_date = DateTime.new 1982, 12, 3, 0, 0, 0, '+6' + end_date = DateTime.new 2010, 11, 30, 0, 0, 0, '+6' + assert_equal("almost 28 years", distance_of_time_in_words(start_date, end_date)) + end + def test_time_ago_in_words assert_equal "about 1 year", time_ago_in_words(1.year.ago - 1.day) end |