2

America/TorontoDST の変更を考慮しながら、秒単位で utc オフセットからtzinfo 形式でタイムゾーンを取得するにはどうすればよいですか。

たとえば、DST 設定が最後に変更されたのは、2014 年 3 月 9 日午前 2 時です。オフセット差を見る

Varinder $ irb

2.1.0 :001 > Time.local(2014,03,9,1,59) 
 => 2014-03-09 01:59:00 -0500 

2.1.0 :002 > Time.local(2014,03,9,2,00) 
 => 2014-03-09 03:00:00 -0400 
2.1.0 :003 >

2.1.0 :006 > Time.local(2014,03,9,2,00).zone
 => "EDT"  # I need America/Toronto format

これらの両方の時間の例では、オフセットの違いのみが DST によるものであるため、計算された tzinfo 文字列は同じである必要があります。

4

2 に答える 2

1

You'll have to figure out the DST issues, but this might get you there (I'm in PST...)

> offset = Time.local(2014,03,9,1,59).utc_offset
=> -28800
> ActiveSupport::TimeZone.all.select{|tz| tz.utc_offset == offset}
=> [#<ActiveSupport::TimeZone:0x007fbcacd075a8 @name="Pacific Time (US & Canada)", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: America/Los_Angeles>, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1394359200>,#<TZInfo::TimezoneOffsetInfo: -28800,3600,PDT>>,#<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1414918800>,#<TZInfo::TimezoneOffsetInfo: -28800,0,PST>>>>, #<ActiveSupport::TimeZone:0x007fbcacd07530 @name="Tijuana", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: America/Tijuana>, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1394359200>,#<TZInfo::TimezoneOffsetInfo: -28800,3600,PDT>>,#<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1414918800>,#<TZInfo::TimezoneOffsetInfo: -28800,0,PST>>>>]
于 2014-03-15T21:03:39.307 に答える
1

これを試して

zone_abbr = Time.local(2014,03,9,2,00).zone
ActiveSupport::TimeZone.
  all.
  select{|tz| tz.tzinfo.current_period.abbreviation.to_s == zone_abbr}.
  map(&:tzinfo).
  map(&:name)

この"EDT"コードの戻り値["America/New_York", "America/Indiana/Indianapolis"]

于 2014-09-11T08:24:47.200 に答える