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
我认为最好的方法是遍历所有pytz时区并检查哪个与本地时区匹配,每个pytz时区对象都包含关于utcoffset和tzname的信息,比如CDT,EST,可以从
time.timezone/altzone
和time.tzname
获得关于本地时间的相同信息,我认为这足以正确匹配pytz数据库中的本地时区,例如输出:
在生产环境中,您可以预先创建这样的映射并保存它,而不是总是迭代。
更改时区后测试脚本:
我知道这是一种欺骗,但是从
'/etc/localtime'
那里得到的东西对你不起作用吗? 如下所示:希望有帮助。
编辑:我喜欢@A.H.的想法,以防
'/etc/localtime'
不是符号链接。将其转换为Python:一个问题是有多个“漂亮的名字”,比如“澳大利亚/悉尼”,它们指向同一个时区(例如CST)。
因此,您需要获取本地时区的所有可能名称,然后选择您喜欢的名称。
例如:对于澳大利亚,有5个时区,但是更多的时区标识符:
您应该检查是否有包装TZinfo的库来处理时区API。
例如:对于Python,请检查
pytz
库:http://pytz.sourceforge.net/
以及
http://pypi.python.org/pypi/pytz/
在Python中,您可以执行以下操作:
但是Python的API似乎非常有限,例如,它似乎没有像Ruby的
all_linked_zone_names
那样的调用——它可以找到给定时区的所有同义名称。相关问题 更多 >
编程相关推荐