如何得到C的localtime
调用给出的值对应的Olson timezone name(比如Australia/Sydney
)?
这是通过TZ
、符号链接/etc/localtime
或在时间相关系统配置文件中设置TIMEZONE
变量覆盖的值.
如何得到C的localtime
调用给出的值对应的Olson timezone name(比如Australia/Sydney
)?
这是通过TZ
、符号链接/etc/localtime
或在时间相关系统配置文件中设置TIMEZONE
变量覆盖的值.
我认为最好的办法是遍历所有pytz时区,判断哪一个与本地时区匹配,每个pytz时区对象包含关于utcoffset和tzname的信息,比如CDT、EST,可以从time.timezone/altzone
和time.tzname
中获得关于本地时间的相同信息,我认为这足以正确匹配pytz数据库中的本地时区.
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',
在生产中,您可以事先创建这样的映射,并将其保存,而不是总是进行迭代.
更改时区后测试脚本:
$export TZ='澳大利亚/悉尼'