2017-08-08 186 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