2017-08-08 79 views
2

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

实例方法不链接到国家:

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

我的问题描述:

  • 我收到与长区标识符给予一定的时区所产生的科学数据集(幸好!)。这些数据集不会在启用地理定位功能的情况下存储,因此时区是生成数据的第一个标识符。
  • 将时区转换为友好标识符是了解其起源的第一步,但许多区域名称相当深奥(美国/梅诺米尼?),因此,从时区到国家列表进行反向查询会很好支持该区域。
+1

什么是你想利用这些信息做什么?我可以想象一个时区ID在多个国家之间共享的情况。 (我不知道目前情况是否确实如此,但例如,如果一个国家分裂成两个国家,至少可能会持续一段时间)。 –

+0

仅供参考。大家都知道New_York在哪里,但是America/Bahia_Banderas? –

+1

https://github.com/eggert/tz/blob/master/zone.tab –

回答

1

我不确定是否有直接的方法,但可以使用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

基于@雨果的答案,短扩展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