记一次 AI 重构生日月份判断的逻辑踩坑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tyqing
V2EX    Cursor

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

  •  
  •   tyqing 27 天前 1053 次点击

    1. 背景与原代码

    原逻辑使用了 Hutool 工具类。由于未进行判空处理,代码隐式依赖 try-catch 来规避空指针异常( NPE )。出于对代码质量的要求(以及个人对 Hutool 的去依赖化偏好),决定让 AI 重写该方法。

    原始代码:

    try { // 原始逻辑:仅判断月份枚举是否相等 boolean isBirthdayMOnth= DateUtil.monthEnum(newDate()) == 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
       27 天前
    不太懂 java ,不过问了 Gemini3 ,貌似能理解`生日月`的概念?
    JustGoGoGO
        2
    JustGoGoGO  
       27 天前
    JustGoGoGO
        3
    JustGoGoGO  
       27 天前
    @TimePPT 请问这个图是怎么传上去的?
    TimePPT
        4
    TimePPT  
    PRO
       27 天前   1
    @JustGoGoGO v2 付费,有图库额度
    tyqing
        5
    tyqing  
    OP
       27 天前
    我的提示词:判断两个日期是否在同一个月份 jdk 8 写个方法br />
    问了网页版的高级模型,都对比了年和月,其实我只是期望只对比月,不对比年。

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

    https://gemini.google.com/share/9d80e400126c
    https://chatgpt.com/share/e/69232b31-1c40-8013-b7cc-84f1e551b6fa
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2622 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 08:49 PVG 16:49 LAX 00:49 JFK 03:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86