好的,根据你所说的和@dhouty的答案:
您希望能够输入偏移量并获取一组日期以了解是否存在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)
my_range.first.to_formatted_s(:long)
my_range.first.strftime('%B %d %Y')
你可以看到,仅仅使用offset就完全可行,但是我说过,offset并不能告诉你所有信息,所以你可能想要获取他们的实际时区并将其存储为字符串,因为该方法仍然会接受该字符串并给出日期范围。即使您只是获取您的时区和他们之间的时间偏移量,您也可以轻松地计算正确的UTC偏移量:
my_offset = -8
their_offset = -3
utc_offset = my_offset + their_offset
.getTimezoneOffset()
获取的偏移量。我知道在美国的某些州和世界上大多数国家都没有夏令时。但是我认为我可以使用我已经拥有的地理位置坐标来解决这个问题。我可以使用它们获取用户的国家/州并进行适当的查询。 - user3790827