【问题标题】:Preserving timezones in Rails在 Rails 中保留时区
【发布时间】:2011-09-20 04:26:52
【问题描述】:

如果我有一个来自客户端的"Wed, 22 Jun 2011 09:43:58 +0200" 形式的时间字符串,我希望将其与保留的时区一起存储。这很重要,因为不仅绝对 UTC 时间很重要,时区也很重要。

Time.zone.parse(t) 会将时间转换为Time.zone 当时使用的任何时区,丢失源时区。

我是否必须从上述字符串中手动提取时区,或者是否有惯用的方法来做到这一点?

【问题讨论】:

    标签: ruby-on-rails datetime timezone


    【解决方案1】:

    我认为您正在寻找以下解决方案:

    在应用控制器中:

    before_filter :get_tz
    
    def get_tz
      @tz = current_user.time_zone
    end
    
    def use_tz
      Time.use_zone @tz do
        yield
      end
    end
    

    并在控制器中在开头添加过滤器

    around_filter :use_tz
    

    【讨论】:

      【解决方案2】:

      DateTime 字段只能存储 'YYYY-MM-DD HH:MM:SS' (MySQL),没有时区信息。

      您应该将日期时间存储在 UTC 中,将时区存储在不同的字段中,最好以整数形式指定与 UTC 的偏移量(以分钟为单位)。

      你可以像这样提取偏移量:

      ruby-1.9.2-p180:001:0>> require 'active_support/all' # included by Rails by default
      # => true
      ruby-1.9.2-p180:002:0>> dt = DateTime.parse "Wed, 22 Jun 2011 09:43:58 +0200"
      # => Wed, 22 Jun 2011 09:43:58 +0200
      ruby-1.9.2-p180:003:0>> dt.utc_offset
      # => 7200
      ruby-1.9.2-p180:004:0>> dt.utc
      # => Wed, 22 Jun 2011 07:43:58 +0000
      

      编辑:

      以及往返练习

      ruby-1.9.2-p180 :039 > u.utc.new_offset(u.offset)
      => Wed, 22 Jun 2011 09:43:58 +0500 
      ruby-1.9.2-p180 :040 > u
      => Wed, 22 Jun 2011 09:43:58 +0500 
      

      【讨论】:

      • 谢谢。以及如何从这两个组件中重新组装原始字符串?那我就准备好了。
      • 我似乎找不到合理的方法来做到这一点。 dt2 = DateTime.parse "Wed, 22 Jun 2011 07:43:58 +0000"; dt2 += 7200.seconds; 可能适用于您的情况。
      • dt2.change(:offset => Rational(7200, 86400)) 如果您还想更改 DateTime 对象中的偏移量。
      • 最好存储时区的实际 name,而不是与 UTC 的分钟偏移量。这样一来,原始时区就很明显了,并且可以将 UTC 时间转换为 then-current-utc-minute-offset。一个恰当的例子是Pulaski county。是的,这种情况很少见,但存储实际时区确实没有任何成本。
      猜你喜欢
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2015-04-08
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多