datetime.datetime.utcnow()

为什么这个datetime没有任何时区信息,因为它是一个明确的UTC日期时间?

我希望它包含tzinfo。


当前回答

这意味着它是无时区的,所以你不能在datetime.astimezone中使用它

你可以给它一个这样的时区

import pytz  # 3rd party: $ pip install pytz

u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset

现在您可以更改时区了

print(u.astimezone(pytz.timezone("America/New_York")))

要获得给定时区的当前时间,你可以直接将tzinfo传递给datetime.now():

#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz

print(datetime.now(pytz.timezone("America/New_York")))

它适用于任何时区,包括那些遵守日光节约时间(DST)的时区,即,它适用于可能在不同时间具有不同utc偏移量的时区(非固定utc偏移量)。不要使用tz. localalize (datetime.now())——当本地时间不明确时,它可能会在dst结束转换期间失败。

其他回答

pytz模块是一个选项,还有另一个python-dateutil,尽管它也是第三方包,但可能已经可用,这取决于您的其他依赖项和操作系统。

我只是想包括这个方法作为参考——如果你已经为其他目的安装了python-dateutil,你可以使用它的tzinfo,而不是用pytz复制

import datetime
import dateutil.tz

# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())

# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())

# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())

我倾向于同意调用utcnow应该包含UTC时区信息。我怀疑这没有包括在内,因为本机datetime库默认为naive datetimes以实现交叉兼容性。

这意味着它是无时区的,所以你不能在datetime.astimezone中使用它

你可以给它一个这样的时区

import pytz  # 3rd party: $ pip install pytz

u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset

现在您可以更改时区了

print(u.astimezone(pytz.timezone("America/New_York")))

要获得给定时区的当前时间,你可以直接将tzinfo传递给datetime.now():

#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz

print(datetime.now(pytz.timezone("America/New_York")))

它适用于任何时区,包括那些遵守日光节约时间(DST)的时区,即,它适用于可能在不同时间具有不同utc偏移量的时区(非固定utc偏移量)。不要使用tz. localalize (datetime.now())——当本地时间不明确时,它可能会在dst结束转换期间失败。

标准的Python库直到Python 3.2才包含任何tzinfo类。我只能猜测原因。我个人认为没有为UTC包含tzinfo类是一个错误,因为它没有足够的争议性,可以有一个标准的实现。尽管库中没有实现,但tzinfo文档中给出了一个示例。

from datetime import timedelta, tzinfo

ZERO = timedelta(0)

# A UTC class.

class UTC(tzinfo):
    """UTC"""

    def utcoffset(self, dt):
        return ZERO

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

    def dst(self, dt):
        return ZERO

utc = UTC()

有了UTC tzinfo对象后,仍然不能将其用于utcnow。获取当前时间作为感知datetime对象:

from datetime import datetime 

now = datetime.now(utc)

在Python 3.2中,他们终于在库中加入了一个UTC tzinfo类:

from datetime import datetime, timezone 

now = datetime.now(timezone.utc)

在Python 3.9中,他们为所有其他时区创建了tzinfo类。有关详细信息,请参阅标准库中的PEP 615—对IANA时区数据库的支持。

在Python 3.2+中添加时区信息

import datetime

>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'

UTC日期不需要任何时区信息,因为它们是UTC,这根据定义意味着它们没有偏移量。