【问题标题】:How to get timezone in a shorter format如何以更短的格式获取时区
【发布时间】:2025-12-08 07:45:01
【问题描述】:

Time.zone.name 给出"Eastern Time (US & Canada)"。有没有办法以较短的格式(如EST)获取 Time 对象的时区?

【问题讨论】:

    标签: ruby-on-rails timezone activesupport


    【解决方案1】:

    Rails 使用 tzinfo gem https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html) ,但未提供您要查找的简码。所以没有直接的方法可以得到它。尽管 Time 类确实有一个名为 zone 的方法,它返回给定时区时间的简码。 所以如果我在你的位置,我会做这样的事情:

    (Time.new.in_time_zone current_user.time_zone).zone
    (Time.new.in_time_zone "Eastern Time (US & Canada)").zone
    

    【讨论】:

    • 试过了,但它一直给我LMT而不是EST
    • 感谢指出,我已经更新了代码。而这一次,在建议之前已经自己检查过了。 :)
    【解决方案2】:

    我也对这个答案很好奇,所以我四处搜索,在这里找到了一个非常简洁的答案:https://makandracards.com/makandra/67330-why-you-can-t-use-timezone-codes-like-pst-or-bst-for-time-objects

    它解释了 Rails TimeWithZones 对象的潜在缺点,但给出了以下答案:

    def human_timezone(time_string, timezone)
      time = time_string.in_time_zone(timezone)
    
      if time.zone.match?(/^\w/)
        time.zone
      else
        time.formatted_offset
      end
    end
    
    >> human_timezone('2019-03-28 16:00', 'Pacific Time (US & Canada)')
    => "PDT"
    >> human_timezone('2019-03-28 16:00', 'Berlin')
    => "CET"
    >> human_timezone('2019-05-01 16:00', 'Almaty')
    => "+06:00"
    

    【讨论】: