ruby-on-rails - Ruby/Rails 中的夏令时开始和结束日期

标签 ruby-on-rails ruby timezone dst timezone-offset

我正在开发一个 Rails 应用程序,我需要在其中找到给定特定偏移量或时区的夏令时开始和结束日期。

我基本上在我的数据库中保存了从用户浏览器接收到的时区偏移量(“+3”“-5”),我想在它出现时修改它由于夏令时的变化。

我知道 Time 实例变量有 dst?isdst 方法,如果存储在它们中的日期在夏令时与否。

 > Time.new.isdst
 => true 

但是使用它来查找夏令时的开始和结束日期会占用太多资源,而且我还必须为我拥有的每个时区偏移量执行此操作。

我想知道更好的方法。

最佳答案

好的,基于你所说的和@dhouty's answer :

您希望能够输入偏移量并获取一组日期以了解是否存在 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

关于ruby-on-rails - Ruby/Rails 中的夏令时开始和结束日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32278565/

相关文章:

javascript - 将正文中的所有数字转换为阿拉伯数字,而不是选择列表 RoR 上的值

Ruby、SQLite 和三角函数

ruby-on-rails - rails 语法错误 : wrong number of arguments

python - DST 更改前后的日期和时区代码

ruby-on-rails - 在rails中递归渲染树

ruby-on-rails - 自定义消息验证不工作的存在

ruby-on-rails - 如何使用渲染 json : with active-model-serializers gem?

ruby - "with(&block)"在 Ruby 中是什么意思?

ruby-on-rails - 如何从 Rails 的下拉列表中获取选定的时区

php - 如何处理MySQL中的时区?