【问题标题】:How do you convert UTC time to EST in ruby (not using Rails)?如何在 ruby​​ 中将 UTC 时间转换为 EST(不使用 Rails)?
【发布时间】:2014-09-22 11:59:00
【问题描述】:

我正在像这样捕获当前时间:

Time.now

我的服务器在 UTC 上运行。如何在不使用任何 Rails 库的情况下将时间转换为 EST?我猜测某种偏移量,但不确定它是如何工作的。

【问题讨论】:

    标签: ruby time


    【解决方案1】:

    如果您不介意使用宝石,

    require 'tzinfo'
    tz = TZInfo::Timezone.get('US/Eastern')
    Time.now.getlocal(tz.current_period.offset.utc_total_offset)
    

    信用:https://stackoverflow.com/a/42702906/2441263

    【讨论】:

      【解决方案2】:

      fbonetti 的回答导致正确的 UTC 到东部时间转换,而接受 David Unric 的回答会在 2017 年给出错误的 8 个月时间(同时 DST 有效)。

      我们看下面的例子:

      首先我们需要弄清楚 2017 年 DST 的开始/结束时间:

      正如我们在 2017 年 3 月 12 日深夜(凌晨 2:00)看到的那样,他们通过增加 +1 小时来更改时间,因此他们从凌晨 1:59:59 瞬间“跳跃”到凌晨 3:00:00!这意味着不能有 2017 年 3 月 12 日凌晨 2:30。

      让我们选择两个 UTC 时间戳 - 一个在切换之前和一个之后,然后我们将尝试将这两个时间戳从 UTC 转换回东部时间。

      第一个时间戳离切换时刻足够远:

      require 'time'
      t1 = Time.parse("2017-03-11 15:00:00 +0000")
      => 2017-03-11 15:00:00 +0000
      t1_epoch_s = t1.to_i
      => 1489244400
      

      第二个时间戳距离第一个时间戳仅 +24 小时:

      t2 = Time.parse("2017-03-12 15:00:00 +0000")
      => 2017-03-12 15:00:00 +0000
      t2_epoch_s = t2.to_i
      => 1489330800
      

      现在让我们将 t1_epoch_s 和 t2_epoch_s 转换为东部:

      方法一:通过添加 Time.zone_offset('EST')
      错了,结果不好:两天都是上午 10 点 :( 并且偏移部分显示为“+0000”,这也具有误导性,并且对于阅读我们输出的人来说指的是完全错误的时间点:((

      Time.at(t1_epoch_s) + Time.zone_offset('EST')
      => 2017-03-11 10:00:00 +0000
      Time.at(t2_epoch_s) + Time.zone_offset('EST')
      => 2017-03-12 10:00:00 +0000
      

      方法 2:通过更改时区
      好的!!正确产生第二天上午 10 点和 11am!-)

      ENV['TZ'] = 'America/New_York'
      Time.at(t1_epoch_s)
      => 2017-03-11 10:00:00 -0500
      Time.at(t2_epoch_s)
      => 2017-03-12 11:00:00 -0400
      # resetting timezone back
      ENV['TZ'] = nil
      

      基本上手动添加 Time.zone_offset('EST') 就像添加常量一样,它会在一年中大约 4 个月(总共 12 个月)给出正确的结果,但其他时间您必须手动添加 Time.zone_offset('EDT'),这是另一个常量。它与“a broken clock is right twice a day”几乎相同:))讨厌!

      只是为了一笑而过,让我们看看“慢动作”如何正确处理实际 +1 小时的魔法时间跳跃:

      ENV['TZ'] = "America/New_York"
      
      Time.at(1489301999 + 0)
      => 2017-03-12 01:59:59 -0500
      
      Time.at(1489301999 + 1)
      => 2017-03-12 03:00:00 -0400
      
      ENV['TZ'] = nil
      

      魔法魔法!

      【讨论】:

        【解决方案3】:

        在纯 Ruby 中,您可以使用 Time.zone_offset 方法:

        require 'time'
        
        t = Time.now                # 2014-07-30 18:30:00 UTC
        t + Time.zone_offset('EST') # 2014-07-30 13:30:00 UTC
        

        【讨论】:

        • 耶稣。另一个可怕的 ruby​​ 文档的例子——Time 类没有提到有一个名为 time 的 Ruby 标准库包,它为 Time 类添加了有用的方法。我要补充一点,操作不应依赖于服务器的偏移量为 0,因此请使用 t = Time.now.utc
        • @7stud 是的。另一方面,ri 在这种情况下可能会有所帮助。显式转换为 UTC 是个好主意。
        • @7stud 自己试试吧 - ri Time 会显示所有 Time 类/模块/扩展的文档。
        • 我明白了,Nothing known about Time
        • 啊,我使用的 ruby​​ 版本没有安装 ri:rvm docs generate-ri
        【解决方案4】:

        在普通 ruby​​ 中,时区由“TZ”环境变量确定。你可以这样做:

        ENV['TZ'] = 'America/New_York' # set the TZ to Eastern Daylight Time
        time = Time.now
        time.zone
        # => "EDT"
        
        # do stuff
        
        ENV['TZ'] = nil # reset the TZ back to UTC
        

        【讨论】:

          猜你喜欢
          • 2018-09-08
          • 2012-06-06
          • 2021-10-27
          • 2021-11-15
          • 2023-04-07
          • 1970-01-01
          • 2014-01-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多