Thanks; that was exactly what I needed. In my Copious Free Time(tm), I would be 
inclined to wrap that up into a method along these lines

def TZInfo::Timezone#period_for_dst(year=Time.now.year)
  # stuff
end

if that's a patch you might be interested in. No worries if not; I can 
understand wanting to keep such a widely-used library lean.

-=Eric
-- 
Eric Schwartz
Software Engineer, Comverge, Inc
w: 720.253.0277 m: 630.447.9675
e: [email protected]





On Oct 4, 2011, at 5:13 PM, Philip Ross wrote:

> Hi Eric,
> 
> On 4 October 2011 19:09, Eric Schwartz <[email protected]> wrote:
>> I need to program a device that tracks DST by setting start/stop times, but 
>> I don't see a way to get at that information from TZInfo... am I missing 
>> something or is there no way other than iterating over every day to figure 
>> out when DST starts and ends each year?
> 
> Your best bet would be to use the period_for_utc method. For a given
> date and time, this method will return a TimezonePeriod object that
> will give you the UTC offset at that time and when the period starts
> and ends (i.e. the previous and next daylight savings transitions).
> 
> You can find the previous or next TimezonePeriod by either subtracting
> a second from the start time or adding a second to the end time and
> calling period_for_utc again.
> 
> The following example will print all the daylight savings and standard
> time periods for New York in the years 2011 to 2020:
> 
> zone = TZInfo::Timezone.get('America/New_York')
> start_year = 2011
> end_year = 2020
> 
> period = zone.period_for_utc(Time.utc(start_year, 1, 1))
> 
> while period
>  offset_hours = period.utc_total_offset / 3600
>  offset_mins = period.utc_total_offset % 3600
>  offset_sign = period.utc_total_offset >= 0 ? '+' : ''
>  offset = "#{offset_sign}#{offset_hours}:#{offset_mins.to_s.rjust(2, '0')}"
> 
>  puts "GMT#{offset} #{period.abbreviation} " +
>       "from #{period.utc_start} #{period.utc_end ?
>                                   "until #{period.utc_end}" : ''}"
> 
>  # If this period has an end time (i.e. daylight savings hasn't been
> abolished),
>  # add a second to the end time and find the next period.
>  period = period.utc_end && period.utc_end.year <= end_year ?
>              zone.period_for_utc(period.utc_end + Rational(1,86400)) :
>              nil
> end
> 
> 
> Kind regards,
> 
> Phil
> _______________________________________________
> TZInfo-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/tzinfo-users

_______________________________________________
TZInfo-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/tzinfo-users

Reply via email to