我的基本要求是我有一个日期时间字符串
dt_a_str
,我必须计算它与当前日期时间之间的差异。但是,使用我当前的代码,我收到以下错误:
Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt_a_str = '2022-04-16T14:27:47.1069564Z'
>>> dt_a = datetime.datetime.strptime(dt_a_str, "%Y-%m-%dT%H:%M:%S.%f4Z")
>>> dt_b = datetime.datetime.now(datetime.timezone.utc)
>>> diff = abs((dt_b - dt_a).seconds)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't subtract offset-naive and offset-aware datetimes
根据我的理解,我正在转换时间和偏移量,即
.%f4Z"
,但为什么它仍然说这是一个偏移天真的日期。
您只能比较既是朴素(无 tzinfo)又是感知(tzinfo 集)的日期时间对象。在解析指令中使用文字 Z 不会将 Z 解析为 UTC。它只是让解析器忽略它,就像处理任何字符一样(例如“:”)。
使用 Python 3.11,fromisoformat 处理 7 位秒小数部分 和 将
Z
解析为 UTC:
Python 3.11.3 (main, May 3 2023, 11:09:17) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
from datetime import datetime
dt_a_str = '2022-04-16T14:27:47.1069564Z'
print(datetime.fromisoformat(dt_a_str))
2022-04-16 14:27:47.106956+00:00
formisoformat
在 3.11 中进行了升级,因此对于较旧的 Python 版本,第三方解析器可能是更安全的选择。例如
from dateutil.parser import isoparse
dt_a_str = '2022-04-16T14:27:47.1069564Z'
print(isoparse(dt_a_str))
2022-04-16 14:27:47.106956+00:00
或
from iso8601 import parse_date
dt_a_str = '2022-04-16T14:27:47.1069564Z'
print(parse_date(dt_a_str))
2022-04-16 14:27:47.106956+00:00