【问题标题】:pytz alternative - using OS timezone as source?pytz 替代方案 - 使用操作系统时区作为源?
【发布时间】: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 来说是不够的。

标签: python timezone dst pytz django-timezone


【解决方案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 不是跨平台的。
    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 2011-12-17
    • 2012-07-03
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2014-01-25
    • 2012-07-27
    相关资源
    最近更新 更多