Получить страну от 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