2014-02-26 64 views
1

我試圖使用Ruby來確定一個國家的時區(來自2個字母的ISO3166國家代碼)。我曾嘗試紅寶石寶石tzinfo如何在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的接近性進行排序。在這種情況下,從東到西。我們想要獲得主要時區,我指的是該國首都所在的時區。 「America/Noronha」是大西洋上一個島嶼的時區。在這種情況下,我們希望獲得巴西利亞(巴西首都)的時區。

基於tzinfo文件,我可以「根據數據源按重要性排序」獲得時區列表使用類TZInfo :: CountryInfo(不知道是什麼的DataSource)

但這似乎不工作:

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

那麼,如何輕鬆獲得一個國家的首都所在的時區?有什麼寶石能夠支持首都時區嗎?

謝謝。

+0

http://www.ruby-doc.org/core-2.1.1/Time.html#method-i-zone –

回答

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

我們想要得到的主要時區,這可以被定義爲省會城市的時區。

呃..沒有。美國「東部時間」是「主要」時區嗎?加州或夏威夷的人肯定會不同意。

同樣適用於俄羅斯,澳大利亞,巴西等世界各地。

你正在從一個錯誤的假設開始工作。沒有一個國家的「主要」時區。一個國家要麼有一個時區,要麼有多個時區,但沒有什麼能夠將首都與「主要」時區聯繫起來。


編輯

根據您的變化和我們的討論,我現在明白你想專門瞭解一個國家的首都城市的時區。由於底層時區數據中沒有任何內容可以區分首都所屬的時區,因此您需要額外的信息來解決此問題。一般來說,步驟如下:

  1. 確定一個國家的首都。你需要一個國家代碼表的資本來做到這一點。

  2. 確定首都的緯度和經度。您可能會找到與國家/地區資本數據相同的來源,或者您可能需要使用其他數據源。

  3. 使用一個of the methods listed here從經度和緯度座標獲取IANA時區標識符。

  4. 對TZInfo gem使用IANA時區標識符。

所以:巴西 - >巴西利亞 - >緯度:-15.7797200,經度:-47.9297200 - >美洲/聖保羅

可能有部分這個信息的是已經在Ruby或者Rails中。我不是Rails開發人員,我也沒有看過。您也可以通過Web服務或公開可用的數據表或csv文件等找到它。

您可能也只是決定讓Web服務爲您完成所有這些工作。步驟3中的答案中的一些API可以接受任意位置而不是緯度/經度。

+0

我通過明確的,無爭議的定義限定了「主要時區」。那就是首都的時區。在實踐中,這是有效的:在美國,EST在俄羅斯是莫斯科時間,在澳大利亞是堪培拉時間。我對技術解決方案感興趣,而不是關於某些國家某些時區的優勢的爭論。謝謝。 –

+0

您認爲美國東部標準在美國比其他時區更佔優勢的基礎是什麼?這是不正確的。 –

+0

如果你想避免這個爭論,那麼不要開始做一個假設。詢問如何獲得首都時區是有效的。但假設首都是「主要」時區是不合理的。但我現在可以告訴你,底層時區數據中沒有區別首都和其他城市的數據。事實上,城市通常是根據人口最稠密的地區而非首都來選擇的。首都城市可能甚至不會成爲有效的時區。例如,沒有「America/Washington_DC」區域。 –

相關問題