datetime.datetime.utcnow()
为什么这个datetime没有任何时区信息,因为它是一个明确的UTC日期时间?
我希望它包含tzinfo。
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,这根据定义意味着它们没有偏移量。