pytz 替代方案 - 使用操作系统时区作为源?
Posted
技术标签:
【中文标题】pytz 替代方案 - 使用操作系统时区作为源?【英文标题】:pytz alternative - using OS timezone as source? 【发布时间】:2012-11-28 12:48:18 【问题描述】:有没有使用 OS timezone/dst 作为源的更简单的 pytz 替代方案?
欢迎使用 ctypes 包装器或不需要编译的东西。
编辑:the beast
【问题讨论】:
pytz 已经是奥尔森时区数据库的包装器。为什么你不想使用它? @Keith 使用 pytz,您必须手动指定时区(例如通过读取/etc/timezone
),这在每个操作系统上都不相同。
有 POSIX 函数,在 time
模块中公开。例如time.timezone
。如果您的系统配置正确,这应该可以正常工作。
time
模块不会给你一个奥尔森时区,不过,只是一个 UTC 偏移量,这对于 pytz AFAIK 来说是不够的。
【参考方案1】:
tzlocal
module 在 *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 会这样做)。
【讨论】:
【参考方案2】: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
如果您的目标系统有这个文件,这可能是更好的方法。
【讨论】:
谢谢,但问题是 /etc/localtime 不是跨平台的。以上是关于pytz 替代方案 - 使用操作系统时区作为源?的主要内容,如果未能解决你的问题,请参考以下文章