From 4146a443b6ffc3d250a280a3b5218c0e5d1a54dd Mon Sep 17 00:00:00 2001 From: Geoff Buesing Date: Tue, 8 Jun 2010 21:35:39 -0500 Subject: Date#since, #ago, #beginning_of_day, #end_of_day, #xmlschema return TimeWithZone when Time.zone_default is set Signed-off-by: Xavier Noria --- .../active_support/core_ext/date/calculations.rb | 8 ++-- .../active_support/core_ext/date/conversions.rb | 12 ++++- activesupport/test/core_ext/date_ext_test.rb | 51 +++++++++++++++++++++- 3 files changed, 65 insertions(+), 6 deletions(-) (limited to 'activesupport') diff --git a/activesupport/lib/active_support/core_ext/date/calculations.rb b/activesupport/lib/active_support/core_ext/date/calculations.rb index 579079d4f1..28fec5394f 100644 --- a/activesupport/lib/active_support/core_ext/date/calculations.rb +++ b/activesupport/lib/active_support/core_ext/date/calculations.rb @@ -57,19 +57,19 @@ class Date # 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) + to_time_in_current_zone.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) + to_time_in_current_zone.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 + to_time_in_current_zone end alias :midnight :beginning_of_day alias :at_midnight :beginning_of_day @@ -77,7 +77,7 @@ class Date # 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 + to_time_in_current_zone.end_of_day end def plus_with_duration(other) #:nodoc: diff --git a/activesupport/lib/active_support/core_ext/date/conversions.rb b/activesupport/lib/active_support/core_ext/date/conversions.rb index 13ef703f49..ba17b0a06b 100644 --- a/activesupport/lib/active_support/core_ext/date/conversions.rb +++ b/activesupport/lib/active_support/core_ext/date/conversions.rb @@ -81,6 +81,16 @@ class Date def to_time(form = :local) ::Time.send("#{form}_time", year, month, day) end + + # Converts Date to a TimeWithZone in the current zone if Time.zone_default is set, + # otherwise converts Date to a Time via Date#to_time + def to_time_in_current_zone + if ::Time.zone_default + ::Time.zone.local(year, month, day) + else + to_time + end + end # Converts a Date instance to a DateTime, where the time is set to the beginning of the day # and UTC offset is set to 0. @@ -94,6 +104,6 @@ class Date end if RUBY_VERSION < '1.9' def xmlschema - to_time.xmlschema + to_time_in_current_zone.xmlschema end end diff --git a/activesupport/test/core_ext/date_ext_test.rb b/activesupport/test/core_ext/date_ext_test.rb index 3e003b3ed4..59c168d33d 100644 --- a/activesupport/test/core_ext/date_ext_test.rb +++ b/activesupport/test/core_ext/date_ext_test.rb @@ -286,19 +286,59 @@ class DateExtCalculationsTest < ActiveSupport::TestCase def test_since assert_equal Time.local(2005,2,21,0,0,45), Date.new(2005,2,21).since(45) end + + def test_since_when_zone_default_is_set + zone = ActiveSupport::TimeZone['Eastern Time (US & Canada)'] + with_env_tz 'UTC' do + with_tz_default zone do + assert_equal zone.local(2005,2,21,0,0,45), Date.new(2005,2,21).since(45) + assert_equal zone, Date.new(2005,2,21).since(45).time_zone + end + end + end def test_ago assert_equal Time.local(2005,2,20,23,59,15), Date.new(2005,2,21).ago(45) end + + def test_ago_when_zone_default_is_set + zone = ActiveSupport::TimeZone['Eastern Time (US & Canada)'] + with_env_tz 'UTC' do + with_tz_default zone do + assert_equal zone.local(2005,2,20,23,59,15), Date.new(2005,2,21).ago(45) + assert_equal zone, Date.new(2005,2,21).ago(45).time_zone + end + end + 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_beginning_of_day_when_zone_default_is_set + zone = ActiveSupport::TimeZone['Eastern Time (US & Canada)'] + with_env_tz 'UTC' do + with_tz_default zone do + assert_equal zone.local(2005,2,21,0,0,0), Date.new(2005,2,21).beginning_of_day + assert_equal zone, Date.new(2005,2,21).beginning_of_day.time_zone + end + end + end def test_end_of_day assert_equal Time.local(2005,2,21,23,59,59,999999.999), Date.new(2005,2,21).end_of_day end - + + def test_end_of_day_when_zone_default_is_set + zone = ActiveSupport::TimeZone['Eastern Time (US & Canada)'] + with_env_tz 'UTC' do + with_tz_default zone do + assert_equal zone.local(2005,2,21,23,59,59,999999.999), Date.new(2005,2,21).end_of_day + assert_equal zone, Date.new(2005,2,21).end_of_day.time_zone + end + end + end + def test_xmlschema with_env_tz 'US/Eastern' do assert_match(/^1980-02-28T00:00:00-05:?00$/, Date.new(1980, 2, 28).xmlschema) @@ -310,6 +350,15 @@ class DateExtCalculationsTest < ActiveSupport::TestCase end end end + + def test_xmlschema_when_zone_default_is_set + with_env_tz 'UTC' do + with_tz_default ActiveSupport::TimeZone['Eastern Time (US & Canada)'] do # UTC -5 + assert_match(/^1980-02-28T00:00:00-05:?00$/, Date.new(1980, 2, 28).xmlschema) + assert_match(/^1980-06-28T00:00:00-04:?00$/, Date.new(1980, 6, 28).xmlschema) + end + end + end def test_today Date.stubs(:current).returns(Date.new(2000, 1, 1)) -- cgit v1.2.3