有没有更简单的pytz替代方案使用操作系统时区/dst作为源?
欢迎使用 ctypes 包装器或不需要编译的东西。
编辑:野兽
C 标准库函数期望在 /etc/localtime
找到本地时间的编译时区定义。 您可以使用 pytz 为其构建一个时区对象,如下所示:
>>> import datetime
>>> import pytz
>>> localtime = pytz.build_tzinfo('localtime', open('/etc/localtime', 'rb'))
>>> print datetime.datetime.now(localtime)
2012-12-11 10:02:40.566735+08:00
这里的一个限制是无法从其内容中确定/etc/localtime
引用的时区,因此,如果要在机器之间腌制日期时间对象或传递对时区的引用,这可能会有问题。
为了允许时区更新,一些Linux发行版还会写出实际的时区名称来/etc/timezone
,这样他们就可以用正确的编译时区定义替换/etc/localtime
。 如果您的目标操作系统执行此操作,则可以像这样使用该文件:
>>> with open('/etc/timezone', 'r') as fp:
... tzname = fp.read().strip()
...
>>> localtime = pytz.timezone(tzname)
>>> print datetime.datetime.now(localtime)
2012-12-11 10:06:36.234822+08:00
如果目标系统具有此文件,则可能是更好的方法。
tzlocal
模块在 *nix 和 Win32 上查找与操作系统本地时区对应的pytz
时区:
from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal
print(datetime.now(get_localzone()))
# -> 2015-01-27 07:20:52.163408+01:00
您的发行版可能会修补pytz
模块以使用OS tz数据库而不是嵌入一个(例如,Ubuntu这样做)。