如何以较短的格式获取时区

问题描述

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

解决方法

我对这个答案也很好奇,因此我四处搜寻,并在这里找到了一个非常简洁的答案: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"
,

路轨使用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