2

给定一个 tzInfoTimeZone对象,例如'America/New_York“我如何获取将使用带有此标识符的时区的关联国家(国家?)?

实例方法不链接回国家:

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

我的问题描述:

  • 我收到了在某个时区生成的科学数据集,该时区带有长区域标识符(幸运的是!)。这些数据集未在启用地理定位的情况下存储,因此时区是生成数据的第一个标识符。
  • 将时区转换为友好的标识符是了解其来源的第一步,但许多时区名称非常深奥(美国/梅诺米尼?),因此最好从时区反向查找支持该名称的国家/地区列表区。
4

2 回答 2

3

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

您可以遍历国家(使用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不会出现在该列表中的名称。

于 2017-08-08T13:27:48.040 回答
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
于 2017-08-08T21:01:20.707 回答