我正试图使用Ruby来确定一个国家的时区(来自两个字母的ISO3166国家代码)。我试过Ruby宝石tzinfo
我可以这样得到巴西的时区:
TZInfo::Country.get("BR").zone_identifiers
=> ["America/Noronha", "America/Belem", "America/Fortaleza", "America/Recife", "America/Araguaina", "America/Maceio", "America/Bahia", "America/Sao_Paulo", "America/Campo_Grande", "America/Cuiaba", "America/Santarem", "America/Porto_Velho", "America/Boa_Vista", "America/Manaus", "America/Eirunepe", "America/Rio_Branco"]
巴西有几个时区。上面的列表是根据与UTC的接近程度进行排序的。在这种情况下,从东到西。我们想得到主时区,我指的是国家首都所在的时区。"美洲/诺罗尼亚"是大西洋上一个岛屿的时区。在这种情况下,我们想得到巴西利亚(巴西首都)的时区。
基于tzinfo文档,我可以使用类tzinfo::CountryInfo(不确定DataSource是什么)获得"根据DataSource按重要性排序"的时区列表
但这似乎不起作用:
>> x=TZInfo::CountryInfo.new('BR', 'Brazil')
=> #<TZInfo::CountryInfo: BR>
>> x.zones
=> []
>> x.zone_identifiers
=> []
那么,如何轻松获取一个国家首都所在的时区呢?有支持首都时区的宝石吗?
谢谢。
在搜索区域之前,您必须设置国家/地区。这应该可以解决您的问题:
x=TZInfo::CountryInfo.new('BR', 'Brazil')
=> #<TZInfo::CountryInfo: BR>
y=TZInfo::Country.get(x.code)
=> #<TZInfo::Country: BR>
y.zones
=> [#<TZInfo::TimezoneProxy: America/Noronha>, #<TZInfo::TimezoneProxy: America/Belem>, #<TZInfo::TimezoneProxy: America/Fortaleza>, #<TZInfo::TimezoneProxy: America/Recife>, #<TZInfo::TimezoneProxy: America/Araguaina>, #<TZInfo::TimezoneProxy: America/Maceio>, #<TZInfo::TimezoneProxy: America/Bahia>, #<TZInfo::TimezoneProxy: America/Sao_Paulo>, #<TZInfo::TimezoneProxy: America/Campo_Grande>, #<TZInfo::TimezoneProxy: America/Cuiaba>, #<TZInfo::TimezoneProxy: America/Santarem>, #<TZInfo::TimezoneProxy: America/Porto_Velho>, #<TZInfo::TimezoneProxy: America/Boa_Vista>, #<TZInfo::TimezoneProxy: America/Manaus>, #<TZInfo::TimezoneProxy: America/Eirunepe>, #<TZInfo::TimezoneProxy: America/Rio_Branco>]
y.zone_identifiers
=> ["America/Noronha", "America/Belem", "America/Fortaleza", "America/Recife", "America/Araguaina", "America/Maceio", "America/Bahia", "America/Sao_Paulo", "America/Campo_Grande", "America/Cuiaba", "America/Santarem", "America/Porto_Velho", "America/Boa_Vista", "America/Manaus", "America/Eirunepe", "America/Rio_Branco"]
我们想要获得主时区,它可以定义为首都的时区。
嗯。。不是。美国的"主要"时区是"东部时间"吗?加州或夏威夷的人肯定不同意。
俄罗斯、澳大利亚、巴西和世界上许多其他地方也是如此。
你是在错误的假设中工作。对于一个国家来说,没有所谓的"主要"时区。一个国家要么有一个时区,要么有多个时区,但没有什么能将首都与"主要"时区联系起来。
编辑
根据你的变化和我们的讨论,我现在知道你特别想知道一个国家首都的时区。由于基本时区数据中没有任何信息可以区分首都所在的时区,因此您需要更多信息来解决此问题。一般来说,步骤如下:
-
确定一个国家的首都。要做到这一点,你需要一张各国首都的国家代码表。
-
确定首都的经纬度。您可能会在与国家/地区资本数据相同的数据源中找到这些数据,或者您可能不得不使用其他数据源。
-
使用此处列出的方法之一从纬度和经度坐标中获取IANA时区标识符。
-
将IANA时区标识符与TZInfo gem一起使用。
所以:巴西->巴西->纬度:-15.7797200,经度:-47.9297200->美国/圣保罗
其中一些信息可能已经存在于Ruby或Rails中。我不是Rails开发人员,也没有看过。你也可以通过网络服务或公开的数据表或csv文件等找到它。
您也可能只是决定让web服务为您完成所有这些工作。步骤3中答案中的一些API可以接受任意位置,而不是lat/lon。