Ruby - Getting the next Daylight Savings change

2019-07-20 08:04发布

问题:

I know there is a method to determine if a certain time is on Daylight Savings Time (Time.now.dst?) but is there a method to give us the next date when Daylight Savings will change?

For example, Google returns Sunday, November 1 as the next Daylight Savings Time change in 2015.

回答1:

Since these are dates that are based on other values, like the timezone you are working with, it requires a module like ActiveSupport/TZInfo.

require 'active_support/core_ext/time/zones'
tz = TZInfo::Timezone.get('US/Pacific')
     # pick a timezone to work with
tz.current_period     #returns an object of the current period 

  => #<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionDefinition: 

     #<TZInfo::TimeOrDateTime: 1425808800>,#<TZInfo::TimezoneOffset: -28800,3600,PDT>>,

     #<TZInfo::TimezoneTransitionDefinition: #<TZInfo::TimeOrDateTime: 1446368400>,

     #<TZInfo::TimezoneOffset: -28800,0,PST>>>

tz.current_period.local_start.to_s
 # => "2015-03-08T03:00:00+00:00"
tz.current_period.local_end.to_s
 #  => "2015-11-01T02:00:00+00:00"

One thing I haven't figured out is that since regular Ruby Core does this:

Time.now.dst?
   # => true

Where is it getting this info? I found the TZInfo classes through ActiveSupport. Is Ruby just getting a boolean value from the OS?



回答2:

How about this extension of the Time class:

class Time
  class << self
    def next_dst_change
      startdate = Date.today
      enddate = Date.today.end_of_year
      match = Date.today.to_time.dst? ? false : true
      startdate.upto(enddate).find { |date| date.to_time if date.to_time.dst? == match }
   end  
 end  
end

Now you can do Time.next_dst_change. You can apply this on your own timezone only but it solves your problem.