Skip to content

Commit

Permalink
[rails#5559] Do not black out the system timezone DST jump hour if Ti…
Browse files Browse the repository at this point in the history
…me.zone differs from that.

The system timezone DST jump hour should not be blacked out by Time.zone.parse if current Time.zone does not do the jump at that time.

Fixes rails#5559.
  • Loading branch information
jarkko committed Mar 23, 2012
1 parent f829515 commit bb4a1d6
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
5 changes: 5 additions & 0 deletions activesupport/lib/active_support/values/time_zone.rb
Expand Up @@ -269,6 +269,11 @@ def parse(str, now=now)
date_parts = Date._parse(str) date_parts = Date._parse(str)
return if date_parts.blank? return if date_parts.blank?
time = Time.parse(str, now) rescue DateTime.parse(str) time = Time.parse(str, now) rescue DateTime.parse(str)

if date_parts[:hour] && time.hour != date_parts[:hour]
time = DateTime.parse(str)
end

if date_parts[:offset].nil? if date_parts[:offset].nil?
ActiveSupport::TimeWithZone.new(nil, self, time) ActiveSupport::TimeWithZone.new(nil, self, time)
else else
Expand Down
20 changes: 19 additions & 1 deletion activesupport/test/time_zone_test.rb
Expand Up @@ -167,7 +167,7 @@ def test_parse_string_with_timezone
(-11..13).each do |timezone_offset| (-11..13).each do |timezone_offset|
zone = ActiveSupport::TimeZone[timezone_offset] zone = ActiveSupport::TimeZone[timezone_offset]
twz = zone.parse('1999-12-31 19:00:00') twz = zone.parse('1999-12-31 19:00:00')
assert_equal twz, zone.parse(twz.to_s) assert_equal twz.to_a, zone.parse(twz.to_s).to_a
end end
end end


Expand Down Expand Up @@ -198,6 +198,24 @@ def test_parse_with_incomplete_date
assert_equal Time.utc(1999,12,31,19), twz.time assert_equal Time.utc(1999,12,31,19), twz.time
end end


def test_parse_should_not_black_out_system_timezone_dst_jump
zone = ActiveSupport::TimeZone['Pacific Time (US & Canada)']
zone.stubs(:now).returns(zone.now)
Time.stubs(:parse).with('2012-03-25 03:29', zone.now).
returns(Time.local(0,29,4,25,3,2012,nil,nil,true,"+03:00"))
twz = zone.parse('2012-03-25 03:29')
assert_equal [0, 29, 3, 25, 3, 2012], twz.to_a[0,6]
end

def test_parse_should_black_out_app_timezone_dst_jump
zone = ActiveSupport::TimeZone['Pacific Time (US & Canada)']
zone.stubs(:now).returns(zone.now)
Time.stubs(:parse).with('2012-03-11 02:29', zone.now).
returns(Time.local(0,29,2,11,3,2012,nil,nil,false,"+02:00"))
twz = zone.parse('2012-03-11 02:29')
assert_equal [0, 29, 3, 11, 3, 2012], twz.to_a[0,6]
end

def test_utc_offset_lazy_loaded_from_tzinfo_when_not_passed_in_to_initialize def test_utc_offset_lazy_loaded_from_tzinfo_when_not_passed_in_to_initialize
tzinfo = TZInfo::Timezone.get('America/New_York') tzinfo = TZInfo::Timezone.get('America/New_York')
zone = ActiveSupport::TimeZone.create(tzinfo.name, nil, tzinfo) zone = ActiveSupport::TimeZone.create(tzinfo.name, nil, tzinfo)
Expand Down

0 comments on commit bb4a1d6

Please sign in to comment.