好的,以您所说的为基础@douty的回答 https://stackoverflow.com/a/32279373/3982562:
您希望能够输入偏移量并获取一组日期来了解是否存在 DST 偏移量。我建议最终使用由两个 DateTime 对象组成的范围,因为这在 Rails 中很容易用于许多目的......
require 'tzinfo'
def make_dst_range(offset)
if dst_end = ActiveSupport::TimeZone[offset].tzinfo.current_period.local_end
dst_start = ActiveSupport::TimeZone[offset].tzinfo.current_period.local_start
dst_range = dst_start..dst_end
else
dst_range = nil
end
end
现在,由于 ActiveSupport 附带的糖分,您拥有的方法不仅可以进行偏移,还可以做更多的事情。您可以执行以下操作:
make_dst_range(-8)
#=> Sun, 08 Mar 2015 03:00:00 +0000..Sun, 01 Nov 2015 02:00:00 +0000
make_dst_range('America/Detroit')
#=> Sun, 08 Mar 2015 03:00:00 +0000..Sun, 01 Nov 2015 02:00:00 +0000
make_dst_range('America/Phoenix')
#=> nil #returns nil because Phoenix does not observe DST
my_range = make_dst_range(-8)
#=> Sun, 08 Mar 2015 03:00:00 +0000..Sun, 01 Nov 2015 02:00:00 +0000
今天正好是 8 月 29 日,所以:
my_range.cover?(Date.today)
#=> true
my_range.cover?(Date.today + 70)
#=> false
my_range.first
#=> Sun, 08 Mar 2015 03:00:00 +0000
#note that this is a DateTime object. If you want to print it use:
my_range.first.to_s
#=> "2015-03-08T03:00:00+00:00"
my_range.last.to_s
#=> "2015-11-01T02:00:00+00:00"
ActiveSupport 为您提供各种展示功能:
my_range.first.to_formatted_s(:short)
#=> "08 Mar 03:00"
my_range.first.to_formatted_s(:long)
#=> "March 08, 2015 03:00"
my_range.first.strftime('%B %d %Y')
#=> "March 08 2015"
正如你所看到的,仅使用偏移量就完全可行,但正如我所说,偏移量并不能告诉你一切,所以你可能想要获取他们的实际时区并将其存储为字符串,因为该方法会很乐意接受该字符串并且仍然给你日期范围。即使您只是获取您的区域与他们的区域之间的时间偏移,您也可以轻松地将其修正为 UTC 偏移:
my_offset = -8
their_offset = -3
utc_offset = my_offset + their_offset