You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java日期格式验证问题:自定义日期类字符校验逻辑失效

日期格式校验代码问题分析与修复

原代码存在的核心问题

  • 字符串比较逻辑错误:Java中==用于判断字符串引用是否相同,而非内容相等。原代码里letter == "/"无法正确匹配斜杠字符,需改为letter.equals("/")。
  • 位置判断逻辑错误:if(i != 2 || i != 5)这个条件永远为true——一个数不可能同时等于2和5,导致所有斜杠都会被判定为非法。正确逻辑应为if(i != 2 && i != 5),即斜杠不在索引2和5的位置时才非法。
  • 非法字符未拦截:原代码仅处理了“非数字但为斜杠”的情况,其他非数字字符(比如多余的斜杠、字母)会进入else分支直接将isADate设为true,导致错误日期无法被识别。
  • 变量名不一致:代码中混用this.date和this.data,属于笔误,需统一变量名。

修复后的constructor方法

public void constructor(String dateInsert) {
    String defaultDate = "01/01/0001";
    if (dateInsert.length() != 10) {
        this.data = defaultDate;
        return;
    }

    boolean isADate = true;
    for (int i = 0; i < dateInsert.length(); i++) {
        char c = dateInsert.charAt(i);
        boolean shouldBeSlash = (i == 2 || i == 5);
        
        if (shouldBeSlash) {
            if (c != '/') {
                isADate = false;
                break; // 发现非法字符直接终止循环
            }
        } else {
            if (!Character.isDigit(c)) {
                isADate = false;
                break;
            }
        }
    }

    this.data = isADate ? dateInsert : defaultDate;
}

额外优化建议

若需进一步校验日期的实际合法性(比如月份范围、对应月份的天数、闰年判断等),可在字符校验通过后添加数值校验逻辑:

// 字符校验通过后补充以下代码
if (isADate) {
    try {
        int day = Integer.parseInt(dateInsert.substring(0, 2));
        int month = Integer.parseInt(dateInsert.substring(3, 5));
        int year = Integer.parseInt(dateInsert.substring(6, 10));
        
        // 基础数值校验
        if (month < 1 || month > 12 || day < 1 || day > 31) {
            isADate = false;
        }
        // 可扩展:添加不同月份的天数校验、闰年2月的特殊处理
    } catch (NumberFormatException e) {
        isADate = false;
    }
}

内容的提问来源于stack exchange,提问作者Ademir Júnior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:05:28