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

