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 替代方案 - 使用操作系统时区作为源?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pytz 从时区字符串中获取 UTC 偏移量?

来自 UTC 偏移的 Pytz 时区

pytz 时区的 STD 偏移量

在 Pandas 系列上使用 pytz 转换时区

使用pytz的python时区转换问题

使用 pytz 获取时区的国家代码?