我试图从datetime.datetime.today()的值中减去一个日期值,以计算多长时间以前的事情。但它抱怨道:

TypeError: can't subtract offset-naive and offset-aware datetimes

datetime.datetime.today()的返回值似乎不是“时区感知”,而我的其他日期值是。我如何从datetime.datetime.today()得到一个时区感知的返回值?

理想的解决方案是让它自动知道时区。

现在,它给我的时间是当地时间,恰好是PST,即UTC - 8小时。最坏的情况下,是否有一种方法我可以手动输入一个时区值到datetime.datetime.today()返回的datetime对象,并将其设置为UTC-8?


当前回答

下面是一个使用可读时区的解决方案,它与today()一起工作:

from pytz import timezone

datetime.now(timezone('Europe/Berlin'))
datetime.now(timezone('Europe/Berlin')).today()

所有时区列表如下:

import pytz

pytz.all_timezones
pytz.common_timezones # or

其他回答

尝试pnp_datetime,所有被使用和返回的时间都带有时区,并且不会导致任何偏移naive和偏移感知问题。

>>> from pnp_datetime.pnp_datetime import Pnp_Datetime
>>>
>>> Pnp_Datetime.utcnow()
datetime.datetime(2020, 6, 5, 12, 26, 18, 958779, tzinfo=<UTC>)

pytz是一个Python库,允许使用Python 2.3或更高版本进行精确的跨平台时区计算。

对于stdlib,这是不可能的。

在SO上可以看到类似的问题。

在标准库中,如果不创建自己的时区类,就没有跨平台的方法来创建感知时区。(编辑:Python 3.9在提供此功能的标准库中引入了zoneinfo。)

在Windows上,有win32timezone.utcnow(),但这是pywin32的一部分。我宁愿建议使用pytz库,它有一个不断更新的大多数时区的数据库。

使用本地时区可能非常棘手(请参阅下面的“进一步阅读”链接),因此您可能更希望在整个应用程序中使用UTC,特别是用于计算两个时间点之间的差值这样的算术操作。

你可以像这样得到当前的日期/时间:

import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)

注意,datetime.today()和datetime.now()返回本地时间,而不是UTC时间,因此对它们应用.replace(tzinfo=pytz.utc)是不正确的。

另一种很好的方法是:

datetime.now(pytz.utc)

它更短一点,做同样的事情。


进一步阅读/观看为什么在许多情况下更喜欢UTC:

pytz文档 关于时间,每个开发人员都应该知道的——许多现实生活用例的开发提示 时间和时区的问题-电脑爱好者-关于使用时区的复杂性的有趣的,令人大开眼界的解释(视频)

使用如下所示的时区来获得一个支持时区的日期时间。默认为UTC:

from django.utils import timezone
today = timezone.now()

如果你在python中获得当前时间和日期,然后在python中导入日期和时间,pytz包后你将获得当前日期和时间,如..

from datetime import datetime
import pytz
import time
str(datetime.strftime(datetime.now(pytz.utc),"%Y-%m-%d %H:%M:%S%t"))