aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorGeoff Buesing <gbuesing@gmail.com>2008-01-25 03:29:20 +0000
committerGeoff Buesing <gbuesing@gmail.com>2008-01-25 03:29:20 +0000
commit8f7232bc76cba944ecb7769bb3dab633ed15c3a6 (patch)
treedf6692bb783be16f6f2bbfb692a3272c66a64499 /activesupport
parentac03ad1f78d88f40924225089a4b4bfebc8c74d8 (diff)
downloadrails-8f7232bc76cba944ecb7769bb3dab633ed15c3a6.tar.gz
rails-8f7232bc76cba944ecb7769bb3dab633ed15c3a6.tar.bz2
rails-8f7232bc76cba944ecb7769bb3dab633ed15c3a6.zip
Time.days_in_month defaults to current year if no year is supplied as argument, uses Date.gregorian_leap? to determine leap year, and uses constant lookup to determine days in month. Closes #10799 [Radar]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8715 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG2
-rw-r--r--activesupport/lib/active_support/core_ext/time/calculations.rb19
-rw-r--r--activesupport/test/core_ext/time_ext_test.rb14
3 files changed, 22 insertions, 13 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index f8d25d130c..8514db47fe 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Time.days_in_month defaults to current year if no year is supplied as argument #10799 [Radar], uses Date.gregorian_leap? to determine leap year, and uses constant lookup to determine days in month [Geoff Buesing]
+
* Adding Time and DateTime #compare_with_coercion, which layers behavior on #<=> so that any combination of Time, DateTime and ActiveSupport::TimeWithZone instances can be chronologically compared [Geoff Buesing]
* TimeZone#now returns an ActiveSupport::TimeWithZone [Geoff Buesing]
diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb
index 534571fe61..eb342084a8 100644
--- a/activesupport/lib/active_support/core_ext/time/calculations.rb
+++ b/activesupport/lib/active_support/core_ext/time/calculations.rb
@@ -18,19 +18,14 @@ module ActiveSupport #:nodoc:
end
end
+ COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
+
module ClassMethods
- # Return the number of days in the given month. If a year is given,
- # February will return the correct number of days for leap years.
- # Otherwise, this method will always report February as having 28
- # days.
- def days_in_month(month, year=nil)
- if month == 2
- !year.nil? && (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) ? 29 : 28
- elsif month <= 7
- month % 2 == 0 ? 30 : 31
- else
- month % 2 == 0 ? 31 : 30
- end
+ # Return the number of days in the given month.
+ # If no year is specified, it will use the current year.
+ def days_in_month(month, year = now.year)
+ return 29 if month == 2 && ::Date.gregorian_leap?(year)
+ COMMON_YEAR_DAYS_IN_MONTH[month]
end
# Returns a new Time if requested year can be accommodated by Ruby's Time class
diff --git a/activesupport/test/core_ext/time_ext_test.rb b/activesupport/test/core_ext/time_ext_test.rb
index 170caf3e09..a7faf4808b 100644
--- a/activesupport/test/core_ext/time_ext_test.rb
+++ b/activesupport/test/core_ext/time_ext_test.rb
@@ -348,7 +348,7 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
assert_equal midnight.midnight, (midnight + 1.hour + 0.000001).midnight
end
- def test_days_in_month
+ def test_days_in_month_with_year
assert_equal 31, Time.days_in_month(1, 2005)
assert_equal 28, Time.days_in_month(2, 2005)
@@ -367,6 +367,18 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
assert_equal 30, Time.days_in_month(11, 2005)
assert_equal 31, Time.days_in_month(12, 2005)
end
+
+ uses_mocha 'TestTimeDaysInMonthWithoutYearArg' do
+ def test_days_in_month_feb_in_common_year_without_year_arg
+ Time.stubs(:now).returns(Time.utc(2007))
+ assert_equal 28, Time.days_in_month(2)
+ end
+
+ def test_days_in_month_feb_in_leap_year_without_year_arg
+ Time.stubs(:now).returns(Time.utc(2008))
+ assert_equal 29, Time.days_in_month(2)
+ end
+ end
def test_time_with_datetime_fallback
assert_equal Time.time_with_datetime_fallback(:utc, 2005, 2, 21, 17, 44, 30), Time.utc(2005, 2, 21, 17, 44, 30)