将字符串 datetime 与 ISO 日期时间格式进行比较

Compare string datetime with ISO datetime format

提问人:K P 提问时间:8/9/2023 更新时间:8/10/2023 访问量:67

问:

我正在尝试将 ISO DateTime 与 Python 代码中的字符串 datetime 进行比较。我在 Azure 云的 JSON 响应中获取日期时间,我需要将其与日期时间之前的最后 24 小时进行比较。我被困在字符串到日期时间的转换中。

代码如下

from datetime import datetime, timedelta

target_date = datetime.now() - timedelta (hours=24)
print(target_date.isoformat())
print(type(target_date))

createdOn = "2022-10-25T21:41:27.2824196Z"
post_time = datetime.strptime(createdOn, "%Y-%m-%dT%H:%M:%S.%f%z")
print(post_time)

我需要比较/检查 createdOn 是否大于 target_date。运行代码时,我出现以下错误

    2023-08-07T13:22:11.914140
<class 'datetime.datetime'>
Traceback (most recent call last):
  File "/Users/Documents/GitHub/Mylabs/mytest.py", line 10, in <module>
    post_time = datetime.strptime(createdOn, "%Y-%m-%dT%H:%M:%S.%f%z")
  File "/Users/.pyenv/versions/3.8.17/lib/python3.8/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/Users/.pyenv/versions/3.8.17/lib/python3.8/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '2022-10-25T21:41:27.2824196Z' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
python-3.x 日期时间

评论

0赞 sudden_appearance 8/9/2023
这回答了你的问题吗?如何解析 ISO 8601 格式的日期?

答:

1赞 Thomas Ward 8/9/2023 #1

您可能会发现使用 python-dateutil 表单 PyPI 进行日期解析更容易。这将解析绝大多数已知的日期格式,并让您更轻松一些。

一旦安装在 PyPI 中,它可以很容易地使用,如下所示:

from datetime import datetime, timedelta, timezone

# Done by answerer for easier reference in code.
from dateutil.parser import parse as dateparse

target_date = datetime.now().astimezone(timezone.utc) - timedelta (hours=24)
print(target_date.isoformat())
print(type(target_date))

createdOn = "2022-10-25T21:41:27.2824196Z"
post_time = dateparse(createdOn)
print(post_time)

实际上,它消除了手动解析的麻烦,这样您就知道它将正确解析日期时间格式并“正常工作”使用不同格式的时间戳。虽然它不能解决您的问题,但它可以更轻松地解析日期和时间戳。(这只是可以做的众多事情之一,但它做得很好)strptimedateutil

由于 的 解析器函数返回一个 datetime 对象,因此您实际上可以直接比较这两个 s。但是,您应该确保target_date的时间是(这就是导入中时区的原因),以确保您比较的是两个时区感知时间。dateutildatetimedatetime.now.astimezone(timezone.utc)datetime

然后你可以直接比较它们。

print(target_date > post_time)例如,如果晚于或等于 ,则打印布尔值。target_datepost_time


Python 3.11 及更高版本具有更易于转换的机制,但是如果您使用较早的任何内容(如 Python 3.8),则 using 将是更好的解析器方法。fromisoformatdateutil