从 tzInfo 时区获取国家/地区?
Get Country from tzInfo TimeZone?
给定一个 tzInfo TimeZone
对象,例如 'America/New_York
' 我怎样才能获得将使用具有此标识符的时区的关联国家(多个国家?)?
实例方法不link返回国家:
http://www.rubydoc.info/gems/tzinfo/TZInfo/Timezone
我的问题描述:
- 我收到了在给定长时区标识符的特定时区生成的科学数据集(幸运的是!)。这些数据集未在启用地理定位的情况下存储,因此时区是生成数据的第一个标识符。
- 将时区变成友好的标识符是了解它们起源的第一步,但许多时区名称非常深奥(America/Menominee?),所以从时区进行反向查找会很棒列出支持该区域的国家/地区。
我不确定是否有直接的方法,但您可以使用 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/London
或 America/New_York
)。所以像 GMT
或 Etc/GMT+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
给定一个 tzInfo TimeZone
对象,例如 'America/New_York
' 我怎样才能获得将使用具有此标识符的时区的关联国家(多个国家?)?
实例方法不link返回国家:
http://www.rubydoc.info/gems/tzinfo/TZInfo/Timezone
我的问题描述:
- 我收到了在给定长时区标识符的特定时区生成的科学数据集(幸运的是!)。这些数据集未在启用地理定位的情况下存储,因此时区是生成数据的第一个标识符。
- 将时区变成友好的标识符是了解它们起源的第一步,但许多时区名称非常深奥(America/Menominee?),所以从时区进行反向查找会很棒列出支持该区域的国家/地区。
我不确定是否有直接的方法,但您可以使用 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/London
或 America/New_York
)。所以像 GMT
或 Etc/GMT+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