从tzInfo TimeZone获取国家/地区?

时间:2017-08-08 12:32:29

标签: ruby localization timezone tzinfo

给定tzInfo TimeZone对象,例如'America/New_York'如何获得将时区与此标识符一起使用的关联国家/地区(国家?)?

实例方法无法链接回国家/地区:

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

我的问题描述:

  • 我收到了在长区标识符给定的特定时区生成的科学数据集(幸运的是!)。这些数据集未在启用地理定位的情况下存储,因此时区是生成数据的第一个标识符。
  • 将时区转换为友好标识符是了解其来源的第一步,但许多区域名称相当深奥(America / Menominee?),因此从时区到国家列表进行反向查找会很棒支持该区域。

2 个答案:

答案 0 :(得分:2)

我不确定是否有直接方式,但您可以使用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等名称不会出现在该列表中。

答案 1 :(得分: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