【问题标题】:Ruby - Getting the next Daylight Savings changeRuby - 获得下一个夏令时变化
【发布时间】:2015-04-08 15:46:46
【问题描述】:

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

例如,Google 会在 2015 年的下一个夏令时更改时返回 Sunday, November 1

【问题讨论】:

    标签: ruby-on-rails ruby timezone dst


    【解决方案1】:

    由于这些是基于其他值的日期,例如您正在使用的时区,它需要一个像 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 只是从操作系统获取布尔值吗?

    【讨论】:

      【解决方案2】:

      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。您只能将其应用于您自己的时区,但它可以解决您的问题。

      【讨论】:

      • 谢谢,但我想远离循环。
      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 2017-11-19
      • 2016-03-12
      • 2016-03-06
      • 2011-06-13
      • 2018-03-05
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多