报表查询传了 startTime=2026-11-13 和 endTime=2026-11-12,接口返回 200 和空列表,导出文件里的时长列算出 -36 小时,运营拿着表来问。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,两个时间字段各自校验了格式,没有做先后关系校验。查询条件 start 大于 end 在 SQL 里天然返回空集,接口看起来一切正常。负值来自导出时用 end 减 start 直接相减,没有兜底。

「时间区间校验」这类改动最怕改一半,回滚脚本先准备好,再动生产。改完顺手把文档补一句,省得下次自己重新推一遍。

curl -s 'http://127.0.0.1:8080/api/report?startTime=2026-11-13&endTime=2026-11-12'
SELECT TIMESTAMPDIFF(HOUR,'2026-11-13','2026-11-12');

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

具体做法是,在 DTO 上加类级自定义校验 断言 start 不晚于 end;controller 收到后统一转成同一时区再比较 避免字符串比较出错;导出层对负时长直接报错 不要写出文件;用 11-13 到 11-12 这组参数回归一次。

最后用这个标准收尾,接口返回 400 提示结束时间早于开始时间 不再生成导出文件。

作者 9823189