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

其他回答

如果你使用的是Django,你可以设置不受tz影响的日期(只有UTC)。

在settings.py中注释下面的行:

USE_TZ = True

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

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

记得先安装pytz。

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

需要强调的是,从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感知”。

另一个选择,在我看来是一个更好的选择,是用摆锤代替pytz。考虑下面的简单代码:

>>> import pendulum

>>> dt = pendulum.now().to_iso8601_string()
>>> print (dt)
2018-03-27T13:59:49+03:00
>>>

要安装Pendulum并查看它们的文档,请点击这里。它有大量的选项(比如简单的ISO8601, RFC3339和许多其他格式的支持),更好的性能和更简单的代码。