为什么datetime.utcnow()返回一个天真的日期时间?

时间:2017-09-28 20:39:49

标签: python

概念问题。为什么datetime.utcnow()会返回一个天真的日期:

from datetime import datetime
datetime.utcnow()

而不是像这样指定UTC时区的时间:

from datetime import datetime, timezone
datetime.utcnow().replace(tzinfo=timezone.utc)

datetime.py 来源表明这是故意的。

@classmethod
def utcnow(cls):
    "Construct a UTC datetime from time.time()."
    t = _time.time()
    return cls.utcfromtimestamp(t)

@classmethod
    def utcfromtimestamp(cls, t):
        """Construct a naive UTC datetime from a POSIX timestamp."""
        return cls._fromtimestamp(t, True, None)

尝试学习背后的思考。谢谢。

修改:从linked question here(谢谢),这似乎是Python 3.2 +的首选方法:

from datetime import datetime, timezone
datetime.datetime.now(datetime.timezone.utc)

1 个答案:

答案 0 :(得分:1)

据我所知,这样你可以伤害自己很多,或者至少我发现这个特定的决定让我无法忍受痛苦。 我认为问题在于发布的Python实际上只支持UTC时区而不支持本地时区。 这种想法似乎是很多人都希望对所有事情使用天真的日期并跟踪(可能基于它是什么程序)无论是UTC还是本地。 所以,涉及时区根本就是你作为程序员必须采取的明确决定,除非你这样做,否则你永远不会得到带有时区的DateTime。

不幸的是,这个决定结合了以下想法:当转换( posix时间时,天真的日期时间被视为本地时间会导致很多混乱。 我已经讨论了一些问题here