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
相关产品推荐
相关产品推荐

