Python用datetime计算日/月/年格式输入日期与当前日期的天数差时代码始终返回0
代码问题逐一拆解
导致你的函数始终返回0的三个明确错误点:
- 入参类型不匹配直接触发异常:
datetime.strptime()的作用是把格式化的日期字符串解析为datetime对象,第一个参数必须是字符串,但代码里给它传了date.today()返回的date类型对象,这一步会直接抛TypeError,被外层的无差别异常捕获抓住,直接走返回0的分支,这是函数恒返回0的核心原因。 - 时间间隔的属性取错:两个时间对象相减得到的是
timedelta类型的时间差,timedelta本身没有.day属性,用来表示总天数差的属性是.days(会带正负值);.day是datetime对象的属性,用来标识当前时间是当月的第几天,读这个属性会抛AttributeError,同样会被无差别捕获触发返回0。 - 异常捕获范围过宽:代码里写的裸
except:会把所有类型的异常都吞掉,不管是代码逻辑写错的类型错误、属性错误,还是真正的“输入日期格式不对”的解析错误,都会被统一处理成返回0,你根本看不到运行时抛出的真实报错,自然没法定位问题。
快速定位问题的方法
调试的时候先把外层的try-except结构整个删掉,直接运行函数传测试值(比如convert_date('3/3/21')),就能直接在控制台看到真实的报错信息,不用反复猜测错误位置。
另外不需要绕弯路把当前日期转成字符串再反向解析成datetime:date.today()本身就是本地时区的当日date对象,和解析后的输入日期直接算差值就可以,完全不需要多此一举做格式转换。
修正后的可运行代码
from datetime import datetime, date def convert_date(input_date): try: current_date = date.today() # 解析输入的日期字符串,取date部分和当前日期类型统一 input_parsed = datetime.strptime(input_date, '%d/%m/%y').date() # 直接计算两个date对象的差值,days属性返回带正负的天数差 delta = input_parsed - current_date return delta.days # 只捕获日期格式解析的异常,其他逻辑报错正常抛出方便调试 except ValueError: return 0
验证逻辑:假设当前实际日期为2021-03-14,输入日期为
'3/3/21',计算得到的差值为(2021-03-03) - (2021-03-14) = -11,和你预期的返回值完全匹配;如果输入格式不符合日/月/年的要求,会触发ValueError返回0,符合格式错误的处理规则。
内容的提问来源于stack exchange,提问作者dwayne_d11
相关产品推荐
相关产品推荐

