aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/lib/active_support/core_ext/time/calculations.rb29
-rw-r--r--activesupport/test/core_ext/time_ext_test.rb17
2 files changed, 45 insertions, 1 deletions
diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb
index 6744930756..acc84017ab 100644
--- a/activesupport/lib/active_support/core_ext/time/calculations.rb
+++ b/activesupport/lib/active_support/core_ext/time/calculations.rb
@@ -54,6 +54,26 @@ module ActiveSupport #:nodoc:
end
end
+ # Returns a new Time representing the time a number of specified years ago
+ def years_ago(years)
+ change(:year => self.year - years)
+ end
+
+ def years_since(years)
+ change(:year => self.year + years)
+ end
+
+ # Short-hand for months_ago(1)
+ def last_year
+ years_since(1)
+ end
+
+ # Short-hand for months_since(1)
+ def next_year
+ years_since(1)
+ end
+
+
# Short-hand for months_ago(1)
def last_month
months_ago(1)
@@ -87,10 +107,17 @@ module ActiveSupport #:nodoc:
# Returns a new Time representing the start of the month (1st of the month, 0:00)
def beginning_of_month
- self - ((self.mday-1).days + self.seconds_since_midnight)
+ #self - ((self.mday-1).days + self.seconds_since_midnight)
+ change(:mday => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
end
alias :at_beginning_of_month :beginning_of_month
+ # Returns a new Time representing the start of the year (1st of january, 0:00)
+ def beginning_of_year
+ change(:month => 1,:mday => 1,:hour => 0, :min => 0, :sec => 0, :usec => 0)
+ end
+ alias :at_beginning_of_year :beginning_of_year
+
# Convenience method which returns a new Time representing the time 1 day ago
def yesterday
self.ago(1.day)
diff --git a/activesupport/test/core_ext/time_ext_test.rb b/activesupport/test/core_ext/time_ext_test.rb
index 5bdabb387e..7ae2062387 100644
--- a/activesupport/test/core_ext/time_ext_test.rb
+++ b/activesupport/test/core_ext/time_ext_test.rb
@@ -22,6 +22,10 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
def test_beginning_of_month
assert_equal Time.local(2005,2,1,0,0,0), Time.local(2005,2,22,10,10,10).beginning_of_month
end
+
+ def test_beginning_of_year
+ assert_equal Time.local(2005,1,1,0,0,0), Time.local(2005,2,22,10,10,10).beginning_of_year
+ end
def test_months_ago
assert_equal Time.local(2005,5,5,10), Time.local(2005,6,5,10,0,0).months_ago(1)
@@ -38,6 +42,19 @@ class TimeExtCalculationsTest < Test::Unit::TestCase
assert_equal Time.local(2006,6,5,10), Time.local(2005,6,5,10,0,0).months_since(12)
assert_equal Time.local(2007,6,5,10), Time.local(2005,6,5,10,0,0).months_since(24)
end
+
+ def test_years_ago
+ assert_equal Time.local(2004,6,5,10), Time.local(2005,6,5,10,0,0).years_ago(1)
+ assert_equal Time.local(1998,6,5,10), Time.local(2005,6,5,10,0,0).years_ago(7)
+ end
+
+ def test_years_since
+ assert_equal Time.local(2006,6,5,10), Time.local(2005,6,5,10,0,0).years_since(1)
+ assert_equal Time.local(2012,6,5,10), Time.local(2005,6,5,10,0,0).years_since(7)
+ # Failure because of size limitations of numeric?
+ # assert_equal Time.local(2182,6,5,10), Time.local(2005,6,5,10,0,0).years_since(177)
+ end
+
def test_ago
assert_equal Time.local(2005,2,22,10,10,9), Time.local(2005,2,22,10,10,10).ago(1)