修复ValidatorDate类countValidData方法的日期验证逻辑缺陷
修复ValidatorDate类的日期统计逻辑
原代码存在两个核心问题:
- 方法签名不符合需求,应为
public static int countValidData(String[] words)而非numaraDateValide - 日期校验逻辑失效,会误判
99/99/9999这类明显无效的日期,且未正确实现"字符串开头为有效日期即可、后续可含其他字符"的规则
以下是修复后的代码,严格遵循SimpleDateFormat实现要求:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; class ValidatorDate { public static int countValidData(String[] words) { SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy"); dateFormatter.setLenient(false); // 关闭宽松解析,强制严格校验日期合法性 int validCount = 0; for (String str : words) { // 先快速过滤不符合格式结构的字符串:长度至少10位,且第3、第6位是分隔符/ if (str.length() < 10 || str.charAt(2) != '/' || str.charAt(5) != '/') { continue; } try { // parse方法会自动解析到第一个无法匹配格式的字符,刚好满足"开头为有效日期"的需求 dateFormatter.parse(str); validCount++; } catch (ParseException e) { // 解析失败说明开头不是有效日期,直接跳过 } } return validCount; } }
关键修复说明
- 修正方法签名:完全匹配需求指定的
public static int countValidData(String[] words) - 严格日期校验:
- 使用
dd/MM/yyyy格式(注意MM代表月份,避免和分钟mm混淆) - 开启
setLenient(false),拒绝所有不合法的日期(比如月份13、32号、非闰年的2月29日等)
- 使用
- 高效前置过滤:先检查字符串长度和分隔符位置,避免对明显不符合格式的字符串做解析操作
- 适配"开头为日期"规则:
SimpleDateFormat.parse()会解析到第一个不符合格式的字符为止,只要字符串开头的日期部分有效,就会判定为符合要求,完美支持后续带任意字符的场景
测试验证
对于需求中的示例输入(修正笔误确保29/02/2000s的开头日期合法):
String[] testInput = new String[]{"Today", "is", "01/04/2019", "01/13/2019", "29/02/2000s"}; System.out.println(ValidatorDate.countValidData(testInput)); // 输出:2
01/04/2019:完整有效日期,解析成功29/02/2000s:开头的29/02/2000是合法闰年日期,解析成功- 其余字符串要么不符合格式结构,要么日期本身无效,被正确过滤
内容的提问来源于stack exchange,提问作者Claudia Nastasiu
相关产品推荐
相关产品推荐

