V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tyqing
V2EX  ›  Cursor

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

  •  
  •   tyqing · 1 天前 · 498 次点击

    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 理解为“判断两个绝对时间是否在同一个月”(同时比较了 YEARMONTH)。

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

    4. 横向对比测试

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

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

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

    💡 结论

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

    以上文案由 ai 润色排版

    5 条回复    2025-11-23 23:46:09 +08:00
    TimePPT
        1
    TimePPT  
    PRO
       1 天前
    不太懂 java ,不过问了 Gemini3 ,貌似能理解`生日月`的概念?
    JustGoGoGO
        2
    JustGoGoGO  
       1 天前
    JustGoGoGO
        3
    JustGoGoGO  
       1 天前
    @TimePPT 请问这个图是怎么传上去的?
    TimePPT
        4
    TimePPT  
    PRO
       1 天前   ❤️ 1
    @JustGoGoGO v2 付费,有图库额度😂
    tyqing
        5
    tyqing  
    OP
       1 天前
    我的提示词:判断两个日期是否在同一个月份 jdk 8 写个方法

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

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

    https://gemini.google.com/share/9d80e400126c
    https://chatgpt.com/share/e/69232b31-1c40-8013-b7cc-84f1e551b6fa
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5503 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 03:15 · PVG 11:15 · LAX 19:15 · JFK 22:15
    ♥ Do have faith in what you're doing.