1. 背景与原代码
原逻辑使用了 Hutool 工具类。由于未进行判空处理,代码隐式依赖 try-catch 来规避空指针异常( NPE )。出于对代码质量的要求(以及个人对 Hutool 的去依赖化偏好),决定让 AI 重写该方法。
原始代码:
try {
// 原始逻辑:仅判断月份枚举是否相等
boolean isBirthdayMonth = DateUtil.monthEnum(new Date()) == DateUtil.monthEnum(userInfo.getDateofbirth());
} catch (Exception e) {
// 吞掉异常
}
2. AI 重构过程
指令 (Prompt):
帮我修复这行的空指针并重新写一个日期判断方法。
模型: Cursor (Claude Sonnet 4.5 thinking)
AI 生成的代码:
boolean isBirthdayMonth = userInfo.getDateofbirth() != null
&& DateUtils.isSameMonth(new Date(), userInfo.getDateofbirth());
/**
* 判断两个日期是否在同一个月份
*
* @param date1 日期 1
* @param date2 日期 2
* @return true-同一月份,false-不同月份
*/
public static boolean isSameMonth(Date date1, Date date2) {
if (date1 == null || date2 == null) {
return false;
}
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
// ⚠️ 问题点:AI 默认加上了年份的判断
return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
&& cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
}
3. 问题分析
AI 修复后的代码虽然解决了 NPE 问题,但引入了严重的逻辑错误:
- 预期逻辑:判断是否是“生日月”(忽略年份,只看月份)。
- 实际逻辑:AI 理解为“判断两个绝对时间是否在同一个月”(同时比较了
YEAR和MONTH)。
后果: 由于出生年份通常不等于当前年份,导致该判断在生日场景下永远返回 false。
4. 横向对比测试
为了验证这是个例还是通病,随后使用类似的提示词在网页版测试了 2 组高级模型
提示词: 判断两个日期是否在同一个月份 jdk 8 写个方法
| 模型 | 结果 | 备注 |
|---|---|---|
| Gemini 3 Pro thinking | ❌ 包含年份判断 | 同样误解了意图 |
| ChatGPT 5 (Thinking) | ❌ 包含年份判断 | 同样误解了意图 |
💡 结论
AI 无法区分“自然月(忽略年份)”和“绝对月(包含年份)”。在涉及生日、纪念日等周期性日期判断时,需明确指示 "Ignore Year" 或 **"只比较月份"**。
以上文案由 ai 润色排版

