如何将 Python 中的时区转换为国家代码?

How to convert timezone to country code in Python?

我用过这个

from pytz import country_timezones

但不包括以下时区

Africa/Asmera, Africa/Timbuktu, America/Argentina/ComodRivadavia, America/Atka, America/Buenos_Aires, America/Catamarca, America/Coral_Harbour, America/Cordoba, America/Ensenada, America/Fort_Wayne, America/Indianapolis, America/Jujuy, America/Knox_IN, America/Louisville, America/Mendoza, America/Montreal, America/Porto_Acre, America/Rosario, America/Shiprock, America/Virgin, Antarctica/South_Pole, Asia/Ashkhabad, Asia/Calcutta, Asia/Chongqing, Asia/Chungking, Asia/Dacca, Asia/Harbin, Asia/Istanbul, Asia/Kashgar, Asia/Katmandu, Asia/Macao, Asia/Saigon, Asia/Tel_Aviv, Asia/Thimbu, Asia/Ujung_Pandang, Asia/Ulan_Bator, Atlantic/Faeroe, Atlantic/Jan_Mayen, Australia/ACT, Australia/Canberra, Australia/LHI, Australia/NSW, Australia/North, Australia/Queensland, Australia/South, Australia/Tasmania, Australia/Victoria, Australia/West, Australia/Yancowinna, Brazil/Acre, Brazil/DeNoronha, Brazil/East, Brazil/West, CET, CST6CDT, Canada/Atlantic, Canada/Central, Canada/East-Saskatchewan, Canada/Eastern, Canada/Mountain, Canada/Newfoundland, Canada/Pacific, Canada/Saskatchewan, Canada/Yukon, Chile/Continental, Chile/EasterIsland, Cuba, EET, EST, EST5EDT, Egypt, Eire, Europe/Belfast, Europe/Nicosia, Europe/Tiraspol, GB, GB-Eire, Greenwich, HST, Hongkong, Iceland, Iran, Israel, Jamaica, Japan, Kwajalein, Libya, MET, MST, MST7MDT, Mexico/BajaNorte, Mexico/BajaSur, Mexico/General, NZ, NZ-CHAT, Navajo, PRC, PST8PDT, Pacific/Ponape, Pacific/Samoa, Pacific/Truk, Pacific/Yap, Poland, Portugal, ROC, ROK, Singapore, Turkey, UCT, US/Alaska, US/Aleutian, US/Arizona, US/Central, US/East-Indiana, US/Eastern, US/Hawaii, US/Indiana-Starke, US/Michigan, US/Mountain, US/Pacific, US/Samoa, UTC, Universal, W-SU, WET, Zulu

如何将这些时区转换为国家代码?

你不能为所欲为。或者,你可以,但你会得到你正在得到的结果,而不是你想要的结果。简而言之,如果您查询 "the country that uses Zulu",但没有国家/地区使用祖鲁语,您将无法找到任何内容。更详细…


正如 Country Information 上的文档所说:

A mechanism is provided to access the timezones commonly in use for a particular country, looked up using the ISO 3166 country code.


但是,"deprecated" 区域如 America/Buenos_Aires 和 "historical" 区域如 US/Pacific 未在任何特定国家/地区使用。其中许多 do 恰好是 are 在某些国家/地区使用的时区的别名,例如 America/Argentina/Buenos_AiresAmerica/Los_Angeles , 但这对你没有任何好处,因为 pytz 不会公开该信息。如果您认为它很重要,您可以针对 pytz 提出增强请求以将其添加到未来的版本中。


无论如何,这就是您识别使用给定时区的国家/地区的方式,如下所示:

{country for country, timezones in country_timezones.items()
 if timezone in timezones}

如果您需要进行大量此类查找,您当然可以构建自己的字典以使其更快更简单:

timezone_countries = {}
for country, timezones in country_timezones.items():
    for timezone in timezones:
        timezone_countries.setdefault(timezone, set()).add(country)

现在只是:

timezone_countries[timezone]

但无论哪种方式,您都可能得到一个空集,或一组 3 个国家,而不是 1 个。如果数据库实际上说有 0 或 3 个国家使用该时区,那就是您要的得到。