diff options
author | Xavier Noria <fxn@hashref.com> | 2010-05-05 00:30:15 +0200 |
---|---|---|
committer | Xavier Noria <fxn@hashref.com> | 2010-05-05 00:35:06 +0200 |
commit | 53c1cd6cde6e34996ff85960f06749b681200908 (patch) | |
tree | 9d69ca78887aa9222a09b945cae581eb70b0d11c /activesupport/lib | |
parent | 38da0ace772e6f9f5e2fff74db76237ab31790fa (diff) | |
download | rails-53c1cd6cde6e34996ff85960f06749b681200908.tar.gz rails-53c1cd6cde6e34996ff85960f06749b681200908.tar.bz2 rails-53c1cd6cde6e34996ff85960f06749b681200908.zip |
let Time.time_with_datetime_fallback handle properly years in the range 0..138
Diffstat (limited to 'activesupport/lib')
-rw-r--r-- | activesupport/lib/active_support/core_ext/date_time/conversions.rb | 6 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/time/calculations.rb | 8 |
2 files changed, 11 insertions, 3 deletions
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 a9f821b01e..24168c7825 100644 --- a/activesupport/lib/active_support/core_ext/date_time/conversions.rb +++ b/activesupport/lib/active_support/core_ext/date_time/conversions.rb @@ -1,5 +1,6 @@ require 'active_support/inflector' require 'active_support/core_ext/time/conversions' +require 'active_support/core_ext/date_time/calculations' class DateTime # Ruby 1.9 has DateTime#to_time which internally relies on Time. We define our own #to_time which allows @@ -72,6 +73,11 @@ class DateTime self end unless method_defined?(:to_datetime) + def self.civil_from_format(utc_or_local, year, month=1, day=1, hour=0, min=0, sec=0) + offset = utc_or_local.to_sym == :local ? local_offset : 0 + civil(year, month, day, hour, min, sec, offset) + end + # Converts datetime to an appropriate format for use in XML def xmlschema strftime("%Y-%m-%dT%H:%M:%S%Z") diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb index 98906bc5c0..2b47ecd543 100644 --- a/activesupport/lib/active_support/core_ext/time/calculations.rb +++ b/activesupport/lib/active_support/core_ext/time/calculations.rb @@ -1,6 +1,7 @@ require 'active_support/duration' require 'active_support/core_ext/date/acts_like' require 'active_support/core_ext/date/calculations' +require 'active_support/core_ext/date_time/conversions' class Time COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] @@ -23,10 +24,11 @@ class Time # (i.e., if year is within either 1970..2038 or 1902..2038, depending on system architecture); # otherwise returns a DateTime def time_with_datetime_fallback(utc_or_local, year, month=1, day=1, hour=0, min=0, sec=0, usec=0) - ::Time.send(utc_or_local, year, month, day, hour, min, sec, usec) + time = ::Time.send(utc_or_local, year, month, day, hour, min, sec, usec) + # This check is needed because Time.utc(y) returns a time object in the 2000s for 0 <= y <= 138. + time.year == year ? time : ::DateTime.civil_from_format(utc_or_local, year, month, day, hour, min, sec) rescue - offset = utc_or_local.to_sym == :local ? ::DateTime.local_offset : 0 - ::DateTime.civil(year, month, day, hour, min, sec, offset) + ::DateTime.civil_from_format(utc_or_local, year, month, day, hour, min, sec) end # Wraps class method +time_with_datetime_fallback+ with +utc_or_local+ set to <tt>:utc</tt>. |