import calendar
y=2025
d=29 if calendar.isleap(y) else 28
print(f"{y}-02-{d:02d}")

生日礼包任务遍历用户生日,2025 年 2 月 28 日跑到一个生日是 02-29 的用户,日志里抛出 DateTimeException: Invalid date 'February 29' as '2025' is not a leap year。整批任务回滚,后面几千人没收到。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,代码用当前年份拼生日月日构造日期,平年没有 2 月 29 日,构造直接失败。遍历又放在一个大事务里,一条异常把整批都带走了。

「闰年日期」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:构造前判断当年是否闰年 平年落到 2 月 28 日或 3 月 1 日 按业务定;遍历改成逐条处理 单条失败只记录不中断;把 02-29 写进测试数据 每年跑一次;生日列别用严格日期约束 或者月日分开存。

改完只确认一件事:用 2025 和 2024 各跑一遍 平年落到 02-28 闰年仍是 02-29 任务不再中断。

作者 9823189