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


当前回答

下面是用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代码中不可用

其他回答

在utc时区中获取一个支持时区的日期就足以让日期减法工作了。

但是如果你想要一个当前时区的时区感知日期,tzlocal是最好的方法:

from tzlocal import get_localzone  # pip install tzlocal
from datetime import datetime
datetime.now(get_localzone())

PS dateutil具有类似的函数(dateutil.tz.tzlocal)。但是尽管共享名称,但它有一个完全不同的代码库,正如J.F.塞巴斯蒂安所指出的那样,这可能会给出错误的结果。

如果你在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"))

另一种构造表示当前时间的时区感知datetime对象的方法:

import datetime
import pytz

pytz.utc.localize( datetime.datetime.utcnow() )  

你可以通过以下命令从PyPI安装pytz:

$ pipenv install pytz

来自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。