Получить страну от tzInfo TimeZone?

Учитывая tzInfo TimeZone такой объект, как 'America/New_York'как я могу получить ассоциированную страну (страны?), которая будет использовать часовой пояс с этим идентификатором?

Методы экземпляра не ссылаются на страны:

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

Описание моей проблемы:

  • Я получаю научные наборы данных, произведенные в определенном часовом поясе, заданном с помощью идентификатора длинной зоны (к счастью!). Эти наборы данных не сохранялись с включенной геолокализацией, поэтому часовой пояс является первым идентификатором, в котором были получены данные.
  • Превращение часового пояса в дружественные идентификаторы - это первый шаг к пониманию их происхождения, но многие названия зон довольно эзотеричны (Америка / Меномини?), Поэтому было бы здорово сделать обратный поиск по часовому поясу в списке стран, которые поддерживают это. зона.

2 ответа

Решение

Я не уверен, есть ли прямой путь, но вы можете использовать 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/London или же America/New_York). Так имена вроде GMT или же Etc/GMT+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
Другие вопросы по тегам