从 tzInfo 时区获取国家/地区?

Get Country from tzInfo TimeZone?

给定一个 tzInfo TimeZone 对象,例如 'America/New_York' 我怎样才能获得将使用具有此标识符的时区的关联国家(多个国家?)?

实例方法不link返回国家:

http://www.rubydoc.info/gems/tzinfo/TZInfo/Timezone

我的问题描述:

我不确定是否有直接的方法,但您可以使用 Country class 构建一个将区域名称映射到国家/地区名称的哈希。

您可以遍历国家(使用 all 方法)并获取每个国家的区域标识符(使用 zone_identifiers 方法)来构建哈希。

我不经常用 Ruby 编写代码,所以它可能不是最好的 Ruby 风格的代码,但它是这样的:

# map zones to countries
ztc = {}

TZInfo::Country.all().each do |c|
  c.zone_identifiers.each do |z|
    ztc[z] = [] unless ztc.has_key?(z)
    ztc[z].push(c.name)
  end
end

ztc 将包含区域名称作为键,并包含相应国家/地区名称的数组作为值。在我的机器中,我有:

{"Europe/Andorra"=>["Andorra"],
 "Asia/Dubai"=>["United Arab Emirates", "Oman"],
 "Asia/Kabul"=>["Afghanistan"],
 "America/Port_of_Spain"=>["Antigua & Barbuda", "Anguilla", "St Barthelemy", "Dominica",
                           "Grenada", "Guadeloupe", "St Kitts & Nevis", "St Lucia",
                           "St Martin (French)", "Montserrat", "Trinidad & Tobago",
                           "St Vincent", "Virgin Islands (UK)", "Virgin Islands (US)"],
  ....

提醒一下,它只包含与国家相关的时区(格式为 Region/City 的时区,例如 Europe/LondonAmerica/New_York)。所以像 GMTEtc/GMT+1 这样的名字不会出现在那个列表中。

根据@Hugo 的回答,class Timezone 的简短扩展:

module TZInfo

class Timezone

    def countries
        return Timezone::country_map[self.name] || []
    end

    @@countryMap = nil

    def self.country_map
        if @@countryMap.nil?
          @@countryMap = {}

            TZInfo::Country.all().each do |c|
                c.zone_identifiers.each do |z|
                    @@countryMap[z] ||= [] 
                    @@countryMap[z] << c.name
                end
            end
        end
        return @@countryMap
    end

end

end