在减去带有提到的偏移量的日期时,无法减去偏移天真和偏移感知的日期时间

问题描述 投票:0回答:1

我的基本要求是我有一个日期时间字符串

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"
,但为什么它仍然说这是一个偏移天真的日期。

python-3.x datetime utc rfc3339
1个回答
-1
投票

您只能比较既是朴素(无 tzinfo)又是感知(tzinfo 集)的日期时间对象。在解析指令中使用文字 Z 不会将 Z 解析为 UTC。它只是让解析器忽略它,就像处理任何字符一样(例如“:”)。

使用 Python 3.11fromisoformat 处理 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
© www.soinside.com 2019 - 2024. All rights reserved.