问题描述
如何获得奥尔森时区名称(例如Australia/Sydney
) 对应于 C 的 localtime
调用给出的值?
How do I get the Olson timezone name (such as Australia/Sydney
) corresponding to the value given by C's localtime
call?
这是通过 TZ
、符号链接 /etc/localtime
或在与时间相关的系统配置中设置 TIMEZONE
变量覆盖的值文件.
This is the value overridden via TZ
, by symlinking /etc/localtime
, or setting a TIMEZONE
variable in time-related system configuration files.
推荐答案
我认为最好的办法是遍历所有 pytz 时区并检查哪个与本地时区匹配,每个 pytz 时区对象都包含有关 utcoffset 和 tzname 的信息,例如 CDT、EST,关于本地时间的相同信息可以从 time.timezone/altzone
和 time.tzname
获得,我认为这足以正确匹配 pytz 数据库中的本地时区,例如
I think best bet is to go thru all pytz timezones and check which one matches local timezone, each pytz timezone object contains info about utcoffset and tzname like CDT, EST, same info about local time can be obtained from time.timezone/altzone
and time.tzname
, and I think that is enough to correctly match local timezone in pytz database e.g.
import time
import pytz
import datetime
local_names = []
if time.daylight:
local_offset = time.altzone
localtz = time.tzname[1]
else:
local_offset = time.timezone
localtz = time.tzname[0]
local_offset = datetime.timedelta(seconds=-local_offset)
for name in pytz.all_timezones:
timezone = pytz.timezone(name)
if not hasattr(timezone, '_tzinfos'):
continue#skip, if some timezone doesn't have info
# go thru tzinfo and see if short name like EDT and offset matches
for (utcoffset, daylight, tzname), _ in timezone._tzinfos.iteritems():
if utcoffset == local_offset and tzname == localtz:
local_names.append(name)
print local_names
输出:
['America/Atikokan', 'America/Bahia_Banderas','America/Bahia_Banderas', 'America/Belize', 'America/Cambridge_Bay',美国/坎昆"、美国/芝加哥"、美国/奇瓦瓦"、'America/Coral_Harbour'、'America/Costa_Rica'、'America/El_Salvador'、'美国/韦恩堡','美国/危地马拉','美国/印第安纳/印第安纳波利斯','美国/印第安纳/诺克斯','美国/印第安纳州/马伦戈','美国/印第安纳州/马伦戈','美国/印第安纳州/彼得堡','美国/印第安纳州/Tell_City','美国/印第安纳州/Vevay','美国/印第安纳州/文森斯',美国/印第安纳/威纳马克"、美国/印第安纳波利斯"、美国/伊魁特"、'美国/肯塔基/路易斯维尔','美国/肯塔基/路易斯维尔','美国/肯塔基/蒙蒂塞洛','美国/诺克斯_IN',美国/路易斯维尔"、美国/路易斯维尔"、美国/马那瓜"、美国/马塔莫罗斯"、美国/梅诺米尼"、美国/梅里达"、'美国/墨西哥城','美国/蒙特雷','America/North_Dakota/Beulah', 'America/North_Dakota/Center','America/North_Dakota/New_Salem', 'America/Ojinaga','America/Pangnirtung'、'America/Rainy_River'、'America/Rankin_Inlet'、美国/坚决"、美国/坚决"、美国/特古西加尔巴"、美国/温尼伯"、CST6CDT"、加拿大/中部"、墨西哥/一般"、'US/Central'、'US/East-Indiana'、'US/Indiana-Starke']
在生产中,您可以预先创建这样的映射并保存它,而不是总是迭代.
In production you can create such a mapping beforehand and save it instead of iterating always.
更改时区后的测试脚本:
Testing script after changing timezone:
$ export TZ='澳大利亚/悉尼'
$ python get_tz_names.py
['南极洲/麦格理','澳大利亚/ACT','澳大利亚/布里斯班',澳大利亚/堪培拉"、澳大利亚/居里"、澳大利亚/霍巴特"、澳大利亚/林德曼"、澳大利亚/墨尔本"、澳大利亚/新南威尔士州"、澳大利亚/昆士兰"、澳大利亚/悉尼"、澳大利亚/塔斯马尼亚"、'澳大利亚/维多利亚']
这篇关于获取本地时区的 Olson TZ 名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!