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

Python 3.10中如何实现时间相减?多种尝试均报错

Python 3.10 时间相减报错解决

错误原因分析及修复

第一种尝试错误

代码:

day_time = timezone.now()
day_name = day_time.strftime("%Y-%m-%d %H:%M:%S")
end_Time = datetime.strptime(latest_slots.end_hour, '%Y-%m-%d %H:%M:%S')
print(end_Time- day_name)

报错:TypeError: unsupported operand type(s) for -: 'str' and 'str'

原因:strftime将day_time(datetime对象)转换为字符串类型,后续用datetime对象end_Time去减字符串day_name,本质是字符串间做减法,Python不支持该操作。

修复:保留day_time的datetime类型,直接用对象运算,不要转成字符串。


第二种尝试错误

代码:

day_time = timezone.now()
end_Time = datetime.strptime(latest_slots.end_hour, '%Y-%m-%d %H:%M:%S')
print(end_Time- day_time)

报错:TypeError: can't subtract offset-naive and offset-aware datetimes

原因:timezone.now()返回带时区信息的datetime对象(offset-aware),而datetime.strptime解析出的是无时区信息的datetime对象(offset-naive),Python不允许两种类型直接相减。

修复:统一两个datetime的时区状态,推荐给end_Time添加时区信息(以UTC时区为例,根据实际场景调整):

from datetime import datetime
import pytz  # 若使用Django可直接用自带的timezone模块

day_time = timezone.now()
# 解析字符串后添加时区
end_Time = datetime.strptime(latest_slots.end_hour, '%Y-%m-%d %H:%M:%S').replace(tzinfo=pytz.UTC)
# Django环境也可使用:end_Time = timezone.make_aware(datetime.strptime(latest_slots.end_hour, '%Y-%m-%d %H:%M:%S'))

print(end_Time - day_time)

若确定无需时区,也可将day_time转为无时区对象(不推荐,易引发时间计算误差):

day_time = timezone.now().replace(tzinfo=None)
end_Time = datetime.strptime(latest_slots.end_hour, '%Y-%m-%d %H:%M:%S')
print(end_Time - day_time)

第三种尝试错误

代码:

day_time = timezone.now()
end_Time = datetime.strptime(latest_slots.end_hour, '%Y-%m-%d %H:%M:%S.000000.00+00')
print(end_Time- day_time)

报错:ValueError: time data '2022-11-27 00:00:00' does not match format '%Y-%m-%d %H:%M:%S.000000.00+00'

原因:格式字符串与输入时间不匹配。输入时间为2022-11-27 00:00:00,但格式字符串额外添加了毫秒、时区偏移等冗余内容,导致解析失败。

修复:使用与输入时间匹配的格式字符串%Y-%m-%d %H:%M:%S,再按照第二种尝试的修复方案处理时区问题即可。


内容的提问来源于stack exchange,提问作者Ahmed Yasin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:35:23