Index: test/tc_timezone.rb =================================================================== --- test/tc_timezone.rb (revision 319) +++ test/tc_timezone.rb (working copy) @@ -383,6 +383,48 @@ assert_raises(PeriodNotFound) { i_tz.period_for_local(i) } end + def test_period_for_local_dst_default_set_true + Timezone.default_dst= true + o1 = TimezoneOffsetInfo.new(-18000, 0, :EST) + o2 = TimezoneOffsetInfo.new(-18000, 3600, :EDT) + + t1 = TimezoneTransitionInfo.new(o2, o1, 1081062000) + t2 = TimezoneTransitionInfo.new(o1, o2, 1099202400) + t3 = TimezoneTransitionInfo.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(p1, tz.period_for_local(dt)) + assert_equal(p1, tz.period_for_local(dt, true)) + assert_equal(p2, tz.period_for_local(dt, false)) + end + + def test_period_for_local_dst_default_set_false + Timezone.default_dst= false + o1 = TimezoneOffsetInfo.new(-18000, 0, :EST) + o2 = TimezoneOffsetInfo.new(-18000, 3600, :EDT) + + t1 = TimezoneTransitionInfo.new(o2, o1, 1081062000) + t2 = TimezoneTransitionInfo.new(o1, o2, 1099202400) + t3 = TimezoneTransitionInfo.new(o2, o1, 1112511600) + + p1 = TimezonePeriod.new(t1, t2) + p2 = TimezonePeriod.new(t2, t3) + + dt = DateTime.new(2004,10,31,1,30,0) + + tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt) + + assert_equal(p2, tz.period_for_local(dt)) + assert_equal(p1, tz.period_for_local(dt, true)) + assert_equal(p2, tz.period_for_local(dt, false)) + end + def test_period_for_local_dst_flag_resolved o1 = TimezoneOffsetInfo.new(-18000, 0, :EST) o2 = TimezoneOffsetInfo.new(-18000, 3600, :EDT) Index: lib/tzinfo/timezone.rb =================================================================== --- lib/tzinfo/timezone.rb (revision 319) +++ lib/tzinfo/timezone.rb (working copy) @@ -68,6 +68,9 @@ # Whether the timezones index has been loaded yet. @@index_loaded = false + # Set a default for DST ambiguity + @@default_dst = nil + # Returns a timezone by its identifier (e.g. "Europe/London", # "America/Chicago" or "UTC"). # @@ -328,7 +331,7 @@ # array of the periods that need to be resolved. The block can select and # return a single period or return nil or an empty array # to cause an AmbiguousTime exception to be raised. - def period_for_local(local, dst = nil) + def period_for_local(local, dst = @@default_dst) results = periods_for_local(local) if results.empty? @@ -487,6 +490,16 @@ Timezone.get(data) end + # Set the default dst for #local_to_utc + def self.default_dst=(value) + @@default_dst = (true && value) + end + + # Get the default dst for #local_to_utc + def self.default_dst + @@default_dst + end + private # Loads in the index of timezones if it hasn't already been loaded. def self.load_index