【问题标题】:How do I construct a UTC `datetime` object in Python?如何在 Python 中构造 UTC `datetime` 对象?
【发布时间】:2015-04-14 09:50:39
【问题描述】:

我正在使用 Python 标准库中的 the datetime.datetime class。我希望用 UTC 时区构造这个类的一个实例。为此,我收集到我需要将 tzinfo 参数作为 datetime 构造函数传递一些 the tzinfo class 的实例。

The documentation for the tzinfo class 说:

tzinfo 是一个抽象基类,意味着这个类不应该被直接实例化。您需要派生一个具体的子类,并且(至少)提供您使用的datetime 方法所需的标准tzinfo 方法的实现。 datetime 模块不提供tzinfo 的任何具体子类。

现在我被难住了。我想做的就是代表“UTC”。我应该可以使用大约三个字符来做到这一点,就像这样

import timezones
...
t = datetime(2015, 2, 1, 15, 16, 17, 345, timezones.UTC)

简而言之,我不会按照文档告诉我的去做。那么我的选择是什么?

【问题讨论】:

  • 为什么不使用pytz - pytz.sourceforge.net?或者您想创建自己的对象?
  • @sKwa 因为我没听说过——谢谢!它看起来正是我想要的。
  • 我很高兴能够提供帮助。但如果你对它的工作原理感兴趣 (tzinfo) 你可以在这里阅读 - agiliq.com/blog/2009/02/…
  • 谢谢。顺便说一句,如果您将您的评论转换为答案,我会接受它。

标签: python datetime timezone


【解决方案1】:

从 Python 3.2 开始,stdlib 中有固定偏移时区:

from datetime import datetime, timezone

t = datetime(2015, 2, 1, 15, 16, 17, 345, tzinfo=timezone.utc)

构造函数是:

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

文档link.

虽然在早期版本上实现 utc 时区很容易:

from datetime import tzinfo, timedelta, datetime

ZERO = timedelta(0)

class UTCtzinfo(tzinfo):
    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

utc = UTCtzinfo()
t = datetime(2015, 2, 1, 15, 16, 17, 345, tzinfo=utc)

【讨论】:

  • 啊哈,谢谢!我正在使用 Python 3.4;我不喜欢阅读 python 3 文档...
【解决方案2】:

我在pytz 中使用了很多,对这个模块非常满意。

pytz

pytz 将 Olson tz 数据库引入 Python。这个库允许 使用 Python 2.4 进行准确的跨平台时区计算 或更高。也解决了结尾时间模糊的问题 夏令时,您可以在 Python 中了解更多信息 库参考 (datetime.tzinfo)。

我也推荐阅读:Understanding DateTime, tzinfo, timedelta & TimeZone Conversions in python

【讨论】:

  • 该链接提供了不正确的信息,例如,比较它如何回答 “如何从现在开始/之后返回两天?”this answer to the related question
  • @J.F.Sebastian 当然,任何人都可能犯错,但要理解它就足够了。我觉得不适合我:(
  • pytz 太过分了。仅导入就非常慢(例如 1-2 秒)。它还将一个 638 文件的包添加到您的依赖项中——只是为了获得一个 7 行的类。
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2016-06-11
  • 2019-09-12
  • 1970-01-01
  • 2023-03-13
  • 2011-09-27
  • 1970-01-01
相关资源
最近更新 更多