如何在Ruby中获得一个国家的首都时区? (TZInfo)

时间:2014-02-26 13:55:45

标签: ruby-on-rails ruby datetime timezone

我正在尝试使用Ruby来确定一个国家/地区的时区(来自2个字母的ISO3166国家/地区代码)。我尝试过Ruby gem 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的接近度进行排序。在这种情况下,从东到西。我们希望得到主要的时区,我指的是该国首都所在的时区。 “America / Noronha”是大西洋岛屿的时区。在这种情况下,我们希望获得巴西利亚(巴西首都)的时区。

基于tzinfo文档,我可以使用类TZInfo :: CountryInfo获取“根据DataSource按重要性排序”的时区列表(不确定DataSource是什么)

但这似乎不起作用:

>> x=TZInfo::CountryInfo.new('BR', 'Brazil')
=> #<TZInfo::CountryInfo: BR>
>> x.zones
=> []
>> x.zone_identifiers
=> []

那么如何轻松获得国家资本所在的时区?有没有支持首都城市时区的宝石?

谢谢。

2 个答案:

答案 0 :(得分:0)

您必须在搜索区域之前设置国家/地区。这应该可以解决您的问题:

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"]

答案 1 :(得分:0)

  

我们希望获得主时区,可以将其定义为首都的时区。

呃......没有。是美国“东部时间”的“主要”时区吗?加利福尼亚州或夏威夷的人肯定不同意。

同样适用于俄罗斯,澳大利亚,巴西和世界上许多其他地方。

你是在做一个错误的假设。没有国家的“主要”时区这样的东西。一个国家要么有一个时区,要么它们有多个时区,但没有任何东西可以将首都与“主要”时区联系起来。


修改

根据您的更改和我们的讨论,我现在明白您想要了解一个国家首都的时区。由于基础时区数据中没有任何内容可以区分首都所属的时区,因此您需要其他信息来解决此问题。一般来说,步骤如下:

  1. 确定一个国家的首都。你需要一个国家代码表到他们的首都。

  2. 确定首都的经纬度。您可能会在与国家/资本数据相同的来源中找到此信息,或者您可能必须使用其他数据源。

  3. 使用一个of the methods listed here从纬度和经度坐标中获取IANA时区标识符。

  4. 将IANA时区标识符与TZInfo gem一起使用。

  5. 所以:巴西 - &gt;巴西利亚 - &gt;纬度:-15.7797200,经度:-47.9297200 - &gt;美国/圣保罗

    有些信息可能已经在Ruby或Rails中了。我不是Rails开发人员,我没看过。您也可以通过Web服务或公共数据表或csv文件等找到它。

    您可能还决定让Web服务为您完成所有这些工作。步骤3中该答案中的一些API可以接受任意位置而不是lat / lon。