记一次 AI 重构生日月份判断的逻辑踩坑

2025 年 11 月 23 日
 tyqing

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 问题,但引入了严重的逻辑错误:

后果: 由于出生年份通常不等于当前年份,导致该判断在生日场景下永远返回 false

4. 横向对比测试

为了验证这是个例还是通病,随后使用类似的提示词在网页版测试了 2 组高级模型

提示词: 判断两个日期是否在同一个月份 jdk 8 写个方法

模型 结果 备注
Gemini 3 Pro thinking ❌ 包含年份判断 同样误解了意图
ChatGPT 5 (Thinking) ❌ 包含年份判断 同样误解了意图

💡 结论

AI 无法区分“自然月(忽略年份)”和“绝对月(包含年份)”。在涉及生日、纪念日等周期性日期判断时,需明确指示 "Ignore Year" 或 **"只比较月份"**。

以上文案由 ai 润色排版

1731 次点击
所在节点    Cursor
5 条回复
TimePPT
2025 年 11 月 23 日
不太懂 java ,不过问了 Gemini3 ,貌似能理解`生日月`的概念?
JustGoGoGO
2025 年 11 月 23 日
JustGoGoGO
2025 年 11 月 23 日
@TimePPT 请问这个图是怎么传上去的?
TimePPT
2025 年 11 月 23 日
@JustGoGoGO v2 付费,有图库额度😂
tyqing
2025 年 11 月 23 日
我的提示词:判断两个日期是否在同一个月份 jdk 8 写个方法

问了网页版的高级模型,都对比了年和月,其实我只是期望只对比月,不对比年。

以下是 ai 的回答,对于模糊的指令,ai 没有理解到我的真实意图,认为“同一个月份”就是绝对年月。
或者猜测中文和英文的此时的语义有点区别。

https://gemini.google.com/share/9d80e400126c
https://chatgpt.com/share/e/69232b31-1c40-8013-b7cc-84f1e551b6fa

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1174543

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX