aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activesupport/CHANGELOG4
-rw-r--r--activesupport/lib/active_support/core_ext/date/conversions.rb18
-rw-r--r--activesupport/lib/active_support/core_ext/date_time/conversions.rb10
-rw-r--r--activesupport/lib/active_support/core_ext/time/conversions.rb3
-rw-r--r--activesupport/test/core_ext/date_ext_test.rb8
-rw-r--r--activesupport/test/core_ext/date_time_ext_test.rb6
6 files changed, 37 insertions, 12 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index ca8d43903a..d3af47bc6a 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,9 @@
*SVN*
+* DateTime#to_time converts to Time unless out of range. #8512 [Geoff Buesing]
+
+* Date#to_datetime, #to_s(:rfc822). #8512 [Geoff Buesing]
+
* Time durations use since instead of + for accuracy. #8513 [Geoff Buesing]
* escape <'s and >'s in JSON strings. #8371 [Rick]
diff --git a/activesupport/lib/active_support/core_ext/date/conversions.rb b/activesupport/lib/active_support/core_ext/date/conversions.rb
index 01dd8461e4..25745b0f8b 100644
--- a/activesupport/lib/active_support/core_ext/date/conversions.rb
+++ b/activesupport/lib/active_support/core_ext/date/conversions.rb
@@ -7,7 +7,8 @@ module ActiveSupport #:nodoc:
:short => "%e %b",
:long => "%B %e, %Y",
:db => "%Y-%m-%d",
- :long_ordinal => lambda { |date| date.strftime("%B #{date.day.ordinalize}, %Y") } # => "April 25th, 2007"
+ :long_ordinal => lambda { |date| date.strftime("%B #{date.day.ordinalize}, %Y") }, # => "April 25th, 2007"
+ :rfc822 => "%e %b %Y"
}
def self.included(klass) #:nodoc:
@@ -27,17 +28,20 @@ module ActiveSupport #:nodoc:
end
end
- # To be able to keep Dates and Times interchangeable on conversions
+ # To be able to keep Times, Dates and DateTimes interchangeable on conversions
def to_date
self
end
+ # Converts self to a Ruby Time object; time is set to beginning of day
+ # Timezone can either be :local or :utc (default :local)
def to_time(form = :local)
- if respond_to?(:hour)
- ::Time.send(form, year, month, day, hour, min, sec)
- else
- ::Time.send(form, year, month, day)
- end
+ ::Time.send("#{form}_time", year, month, day)
+ end
+
+ # Converts self to a Ruby DateTime object; time is set to beginning of day
+ def to_datetime
+ ::DateTime.civil(year, month, day, 0, 0, 0, 0, 0)
end
def xmlschema
diff --git a/activesupport/lib/active_support/core_ext/date_time/conversions.rb b/activesupport/lib/active_support/core_ext/date_time/conversions.rb
index 0b66593499..1b78a72eea 100644
--- a/activesupport/lib/active_support/core_ext/date_time/conversions.rb
+++ b/activesupport/lib/active_support/core_ext/date_time/conversions.rb
@@ -20,11 +20,19 @@ module ActiveSupport #:nodoc:
end
end
+ # Converts self to a Ruby Date object; time portion is discarded
def to_date
::Date.new(year, month, day)
end
- # To be able to keep Times and DateTimes interchangeable on conversions
+ # Attempts to convert self to a Ruby Time object; returns self if out of range of Ruby Time class
+ # If self.offset is 0, then will attempt to cast as a utc time; otherwise will attempt to cast in local time zone
+ def to_time
+ method = if self.offset == 0 then 'utc' else 'local' end
+ ::Time.send(method, year, month, day, hour, min, sec) rescue self
+ end
+
+ # To be able to keep Times, Dates and DateTimes interchangeable on conversions
def to_datetime
self
end
diff --git a/activesupport/lib/active_support/core_ext/time/conversions.rb b/activesupport/lib/active_support/core_ext/time/conversions.rb
index 3945fe8f8c..7829c2e581 100644
--- a/activesupport/lib/active_support/core_ext/time/conversions.rb
+++ b/activesupport/lib/active_support/core_ext/time/conversions.rb
@@ -29,11 +29,12 @@ module ActiveSupport #:nodoc:
end
end
+ # Converts self to a Ruby Date object; time portion is discarded
def to_date
::Date.new(year, month, day)
end
- # To be able to keep Dates and Times interchangeable on conversions
+ # To be able to keep Times, Dates and DateTimes interchangeable on conversions
def to_time
self
end
diff --git a/activesupport/test/core_ext/date_ext_test.rb b/activesupport/test/core_ext/date_ext_test.rb
index 6a0508b8c4..3557c11748 100644
--- a/activesupport/test/core_ext/date_ext_test.rb
+++ b/activesupport/test/core_ext/date_ext_test.rb
@@ -6,14 +6,16 @@ class DateExtCalculationsTest < Test::Unit::TestCase
assert_equal "February 21, 2005", Date.new(2005, 2, 21).to_s(:long)
assert_equal "February 21st, 2005", Date.new(2005, 2, 21).to_s(:long_ordinal)
assert_equal "2005-02-21", Date.new(2005, 2, 21).to_s(:db)
+ assert_equal "21 Feb 2005", Date.new(2005, 2, 21).to_s(:rfc822)
end
def test_to_time
assert_equal Time.local(2005, 2, 21), Date.new(2005, 2, 21).to_time
+ assert_equal Time.local_time(2039, 2, 21), Date.new(2039, 2, 21).to_time
end
-
- def test_to_time_on_datetime
- assert_equal Time.local(2005, 2, 21, 10, 11, 12), DateTime.new(2005, 2, 21, 10, 11, 12).to_time
+
+ def test_to_datetime
+ assert_equal DateTime.civil(2005, 2, 21), Date.new(2005, 2, 21).to_datetime
end
def test_to_date
diff --git a/activesupport/test/core_ext/date_time_ext_test.rb b/activesupport/test/core_ext/date_time_ext_test.rb
index 0aacf123c3..b5d80295f0 100644
--- a/activesupport/test/core_ext/date_time_ext_test.rb
+++ b/activesupport/test/core_ext/date_time_ext_test.rb
@@ -21,6 +21,12 @@ class DateTimeExtCalculationsTest < Test::Unit::TestCase
def test_to_date
assert_equal Date.new(2005, 2, 21), DateTime.new(2005, 2, 21).to_date
end
+
+ def test_to_time
+ assert_equal Time.utc(2005, 2, 21, 10, 11, 12), DateTime.new(2005, 2, 21, 10, 11, 12, 0, 0).to_time
+ assert_equal Time.local(2005, 2, 21, 10, 11, 12), DateTime.new(2005, 2, 21, 10, 11, 12, Rational(-5, 24), 0).to_time
+ assert_equal Time.utc_time(2039, 2, 21, 10, 11, 12), DateTime.new(2039, 2, 21, 10, 11, 12, 0, 0).to_time
+ end
def test_seconds_since_midnight
assert_equal 1,DateTime.civil(2005,1,1,0,0,1).seconds_since_midnight