2013-05-07 63 views
5

我有一個java TimeZone對象,例如America/Denver。理論上,IANA database列出了該時區的一個國家代碼,即US獲取給定的java的國家TimeZone

在java或Android中,如何獲取指定時區對象的國家?

更新:請注意,我不是在談論將GMT+0700映射到特定的國家。顯然,可能有多個國家映射到單個原始偏移量。我正在討論將特定時區代碼從https://en.wikipedia.org/wiki/Zone.tab映射到其相關的單一國家/地區代碼。

+0

請參閱本:HTTP://stackoverflow.com/questions/1389837/is-there-a-way-to-get-a-timezone-with-only-a-country-code-valid- iso-3166-code – NINCOMPOOP 2013-05-07 17:32:32

+0

@NoobUnChained - 他要求TZID去國家。不是國家到TZID。除管理區域外,這應該是可能的。另一個方向就是你正在談論的內容,這當然是行不通的。 – 2013-05-07 20:05:30

回答

0

你不能,從TimeZone到Country沒有1:1的關係。
例如,還有timezone「UTC」

+0

看不到UTC或類似的問題返回null。對絕對多數的時區來說,國家代碼將會很整齊。 – ruruskyi 2014-04-29 10:11:16

0

您給zone.tab的鏈接實際上是您要查找的數據的來源。當然,你想要使用一個authoritative,而不是維基百科上的副本。

IANA/Olson數據庫在Java中使用JodaTime庫實現。但我不相信他們通過任何類暴露zone.tab。至少我找不到它。如果我在這方面不正確,請更新我。

您可以隨時導入文件並根據需要使用它。

UPDATE

我什麼都不知道關於Android,但我發現一些可能對你有意義。似乎有一個功能,揭露zone.tab數據libcore.icu.TimeZoneNames.forLocale(locale)

我搜查了,但我找不到任何參考文件。

+0

是的,那是我的問題。你會認爲這將是微不足道的暴露,但我沒有看到它的任何地方暴露在java/android apis(我沒有看過jodatime) – emmby 2013-05-07 22:25:50

+0

@emmby - 請參閱我的更新中的鏈接#149行。這有幫助嗎? – 2013-05-07 22:59:10

6

爲了在國家和時區之間映射,我使用了ICU library。 使用com.ibm.icu.util.TimeZone.getAvailableIDs(countryCode)方法,我設法將時區映射到國家代碼。

public static Map<String, String> mapTimezonesToCountries() { 
    Map<String, String> timezoneToCountry = new HashMap<>(); 

    String[] locales = Locale.getISOCountries(); 

    for (String countryCode : locales) { 
     for (String id : com.ibm.icu.util.TimeZone.getAvailableIDs(countryCode)) 
     { 
      // Add timezone to result map 

      timezoneToCountry.put(id, countryCode); 
     } 

    } 
    return timezoneToCountry; 

} 
+0

釘它兄弟! :d – 2016-02-09 08:29:10