我试图从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?


当前回答

来自howchoo的Tyler写了一篇非常棒的文章,帮助我更好地了解了Datetime对象,链接如下

使用Datetime

实际上,我只是在两个datetime对象的末尾添加了以下内容

.replace(tzinfo=pytz.utc)

例子:

import pytz
import datetime from datetime

date = datetime.now().replace(tzinfo=pytz.utc)

其他回答

获取特定时区的当前时间:

import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))

记得先安装pytz。

下面是用stdlib生成它的一种方法:

import time
from datetime import datetime

FORMAT='%Y-%m-%dT%H:%M:%S%z'
date=datetime.strptime(time.strftime(FORMAT, time.localtime()),FORMAT)

date将存储本地日期和与UTC的偏移量,而不是UTC时区的日期,因此如果需要确定日期是在哪个时区生成的,可以使用此解决方案。在这个例子中,在我的本地时区:

date
datetime.datetime(2017, 8, 1, 12, 15, 44, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

date.tzname()
'UTC+02:00'

关键是将%z指令添加到表示FORMAT中,以指示生成的时间结构的UTC偏移量。其他表示格式可以参考datetime模块文档

如果需要UTC时区的日期,可以将time.localtime()替换为time.gmtime()

date=datetime.strptime(time.strftime(FORMAT, time.gmtime()),FORMAT)

date    
datetime.datetime(2017, 8, 1, 10, 23, 51, tzinfo=datetime.timezone.utc)

date.tzname()
'UTC'

Edit

这只适用于python3。z指令在python 2 _strptime.py代码中不可用

需要强调的是,从Python 3.6开始,你只需要标准库来获得一个表示本地时间的时区感知datetime对象(操作系统的设置)。使用astimezone ()

import datetime

datetime.datetime(2010, 12, 25, 10, 59).astimezone()
# e.g.
# datetime.datetime(2010, 12, 25, 10, 59, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), 'Mitteleuropäische Zeit'))

datetime.datetime(2010, 12, 25, 12, 59).astimezone().isoformat()
# e.g.
# '2010-12-25T12:59:00+01:00'

# I'm on CET/CEST

(见@johnchen902的评论)。

注意,这里有一个小警告,不要期望timedelta时区有任何“dst感知”。

尝试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>)

来自howchoo的Tyler写了一篇非常棒的文章,帮助我更好地了解了Datetime对象,链接如下

使用Datetime

实际上,我只是在两个datetime对象的末尾添加了以下内容

.replace(tzinfo=pytz.utc)

例子:

import pytz
import datetime from datetime

date = datetime.now().replace(tzinfo=pytz.utc)