Browse files

Add Date#since, ago, beginning_of_day, and end_of_day. Date + seconds…

… works now. Closes #8575.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6937 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent 4685fa0 commit 1b32a305df40829c650a5254441eaec491e9f086 @jeremy jeremy committed Jun 4, 2007
View
2 activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Add Date#since, ago, beginning_of_day, and end_of_day. Date + seconds works now. #8575 [Geoff Buesing]
+
* String#to_time overflows to DateTime. Add String#to_datetime. #8572 [Geoff Buesing]
* Date.yesterday and .tomorrow. #8571 [Geoff Buesing]
View
26 activesupport/lib/active_support/core_ext/date/calculations.rb
@@ -23,6 +23,32 @@ def tomorrow
end
end
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
+ # and then subtracts the specified number of seconds
+ def ago(seconds)
+ to_time.since(-seconds)
+ end
+
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
+ # and then adds the specified number of seconds
+ def since(seconds)
+ to_time.since(seconds)
+ end
+ alias :in :since
+
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
+ def beginning_of_day
+ to_time
+ end
+ alias :midnight :beginning_of_day
+ alias :at_midnight :beginning_of_day
+ alias :at_beginning_of_day :beginning_of_day
+
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
+ def end_of_day
+ to_time.end_of_day
+ end
+
def plus_with_duration(other) #:nodoc:
if ActiveSupport::Duration === other
other.since(self)
View
5 activesupport/lib/active_support/duration.rb
@@ -65,15 +65,12 @@ def inspect #:nodoc:
def sum(sign, time = ::Time.now) #:nodoc:
parts.inject(time) do |t,(type,number)|
- if t.acts_like?(:time)
+ if t.acts_like?(:time) || t.acts_like?(:date)
if type == :seconds
t.since(sign * number)
else
t.advance(type => sign * number)
end
- elsif t.acts_like?(:date)
- raise ArgumentError, "Adding seconds to a Date does not make sense" if type == :seconds
- t.advance(type => sign * number)
else
raise ArgumentError, "expected a time or date, got #{time.inspect}"
end
View
16 activesupport/test/core_ext/date_ext_test.rb
@@ -139,4 +139,20 @@ def test_yesterday_constructor
def test_tomorrow_constructor
assert_equal Date.today + 1, Date.tomorrow
end
+
+ def test_since
+ assert_equal Time.local(2005,2,21,0,0,45), Date.new(2005,2,21).since(45)
+ end
+
+ def test_ago
+ assert_equal Time.local(2005,2,20,23,59,15), Date.new(2005,2,21).ago(45)
+ end
+
+ def test_beginning_of_day
+ assert_equal Time.local(2005,2,21,0,0,0), Date.new(2005,2,21).beginning_of_day
+ end
+
+ def test_end_of_day
+ assert_equal Time.local(2005,2,21,23,59,59), Date.new(2005,2,21).end_of_day
+ end
end
View
4 activesupport/test/core_ext/numeric_ext_test.rb
@@ -90,7 +90,9 @@ def setup
def test_date_plus_duration
assert_equal @today + 1, @today + 1.day
assert_equal @today >> 1, @today + 1.month
- assert_raises(ArgumentError) { @today + 1.second }
+ assert_equal @today.to_time.since(1), @today + 1.second
+ assert_equal @today.to_time.since(60), @today + 1.minute
+ assert_equal @today.to_time.since(60*60), @today + 1.hour
end
def test_chaining_duration_operations

0 comments on commit 1b32a30

Please sign in to comment.