Ruby - 获得下一个夏令时的变化

时间:2015-04-07 14:36:03

标签: ruby-on-rails ruby timezone dst

我知道有一种方法可以确定某个时间是否在夏令时(Time.now.dst?)上,但有没有办法让我们知道夏令时会改变的下一个日期?

例如,Google会将Sunday, November 1作为2015年下一个夏令时变化返回。

2 个答案:

答案 0 :(得分:4)

由于这些是基于其他值的日期,例如您正在使用的时区,因此需要一个类似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"

我还没想到的一件事是,因为常规Ruby Core会这样做:

Time.now.dst?
   # => true

获取此信息的位置在哪里?我通过ActiveSupport找到了TZInfo类。 Ruby刚刚从操作系统获得布尔值吗?

答案 1 :(得分:0)

Time类的这个扩展怎么样:

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

现在你可以做Time.next_dst_change。您可以仅在自己的时区应用此功能,但它可以解决您的问题。