datetime.datetime.utcnow()
为什么这个datetime没有任何时区信息,因为它是一个明确的UTC日期时间?
我希望它包含tzinfo。
datetime.datetime.utcnow()
为什么这个datetime没有任何时区信息,因为它是一个明确的UTC日期时间?
我希望它包含tzinfo。
当前回答
注意,对于Python 3.2起,datetime模块包含datetime.timezone。datetime.utcnow()的文档说:
可感知的当前UTC日期时间可以通过调用datetime.now(timezone.utc)来获得。
因此,datetime.utcnow()不会设置tzinfo来指示它是UTC,但datetime.now(datetime.timezone.utc)会返回UTC时间并设置tzinfo。
所以你可以这样做:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
其他回答
UTC日期不需要任何时区信息,因为它们是UTC,这根据定义意味着它们没有偏移量。
在Python 3.2+中添加时区信息
import datetime
>>> d = datetime.datetime.now(tz=datetime.timezone.utc)
>>> print(d.tzinfo)
'UTC+00:00'
from datetime import datetime
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]
标准的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起,datetime模块包含datetime.timezone。datetime.utcnow()的文档说:
可感知的当前UTC日期时间可以通过调用datetime.now(timezone.utc)来获得。
因此,datetime.utcnow()不会设置tzinfo来指示它是UTC,但datetime.now(datetime.timezone.utc)会返回UTC时间并设置tzinfo。
所以你可以这样做:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)