You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中ISO时间字符串与Datetime比较:转换报错问题求助

问题解决:Azure ISO时间字符串转datetime并实现时间比较

问题原因

  1. 微秒格式不匹配:Azure返回的时间字符串包含7位微秒(例如2022-10-25T21:41:27.2824196Z中的2824196),但Python 3.8及更早版本的datetime.strptime方法中,%f格式符仅支持最多6位微秒,导致格式匹配失败。
  2. 时区不一致:target_date默认是不带时区信息的naive datetime对象,而转换后的post_time需要是带UTC时区的aware对象,直接比较会引发类型错误。

解决方案

方案一:手动处理微秒与时区(无额外依赖)

通过截断多余的微秒位,统一时区为UTC,实现正确解析与比较:

from datetime import datetime, timedelta, timezone

# 生成带UTC时区的24小时前时间(aware对象)
target_date = datetime.now(timezone.utc) - timedelta(hours=24)

createdOn = "2022-10-25T21:41:27.2824196Z"
# 截断7位微秒为6位,保留Z标识
truncated_time = createdOn[:-2] + createdOn[-1]
# 解析并指定UTC时区
post_time = datetime.strptime(truncated_time, "%Y-%m-%dT%H:%M:%S.%fZ").replace(tzinfo=timezone.utc)

# 执行时间比较
if post_time > target_date:
    print("createdOn 晚于24小时前的UTC时间")
else:
    print("createdOn 早于或等于24小时前的UTC时间")

方案二:使用python-dateutil简化解析(推荐)

安装python-dateutil库(支持解析各种ISO时间格式变体):

pip install python-dateutil

代码实现:

from datetime import datetime, timedelta, timezone
from dateutil import parser

# 生成带UTC时区的24小时前时间
target_date = datetime.now(timezone.utc) - timedelta(hours=24)

createdOn = "2022-10-25T21:41:27.2824196Z"
# 自动解析ISO时间,识别7位微秒与UTC时区
post_time = parser.isoparse(createdOn)

# 执行时间比较
if post_time > target_date:
    print("createdOn 晚于24小时前的UTC时间")
else:
    print("createdOn 早于或等于24小时前的UTC时间")

关键说明

  • 必须确保比较的两个datetime对象时区一致:要么都为带UTC时区的aware对象,要么都转为naive对象(不推荐,易引发时区错误)。
  • parser.isoparse方法无需手动指定格式,能兼容更多ISO时间格式变体,适合处理云服务返回的标准时间字符串。

内容的提问来源于stack exchange,提问作者K P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:43:39