dateparser.parse解析时间戳报NoneType类型TypeError排查
问题根因
打印内容和报错不属于同一次函数调用,具体逻辑问题如下:
- 代码顺序错误:类型打印语句放在了解析操作之后。当某次调用传入的
snapshot_timestamp为None时,代码会直接在解析行抛出异常,无法执行到后续打印逻辑,你看到的字符串类型、时间值输出,都是上一次传入合法参数时的运行结果,不是触发报错的那次调用的入参信息。 - 遍历数据源存在空值:从输出开头的
Checking backups (2022-06-02 12:08 PM)可以判断,你在循环校验多个备份快照,绝大多数快照的时间字段为合法字符串,但存在个别快照时间字段缺失,提取到的snapshot_timestamp值为None,传入解析函数后触发入参类型错误。
修复方法
- 调整代码顺序,将入参校验、入参打印逻辑移到时间解析操作之前,提前拦截空值
- 增加解析结果判空逻辑,避免
dateparser解析失败返回None时,链式调用astimezone触发属性错误 - 时间差计算时实时获取当前UTC时间,不要依赖全局变量存储的时间,避免出现计算偏差
修复后可直接运行的代码:
from datetime import datetime import dateparser from pytz import timezone def check_snapshot(snapshot_timestamp): # 入参校验前置 print(f"入参值:{snapshot_timestamp},入参类型:{type(snapshot_timestamp)}") if not snapshot_timestamp or not isinstance(snapshot_timestamp, str): return False parsed_result = dateparser.parse(snapshot_timestamp) if not parsed_result: return False timestamp_formatted = parsed_result.astimezone(timezone('UTC')) # 实时获取当前UTC时间 now_utc = datetime.now(timezone('UTC')) print(f"当前UTC时间:{now_utc},解析后快照时间:{timestamp_formatted}") diff_hours = (now_utc - timestamp_formatted).total_seconds() / 3600 return diff_hours <= 24
如果需要定位具体哪个快照触发空值,直接在遍历备份、提取snapshot_timestamp的位置加打印,找到时间字段缺失的项,在提取阶段做空值兜底即可。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

