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

修复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;
    }
}

关键修复说明

  1. 修正方法签名:完全匹配需求指定的public static int countValidData(String[] words)
  2. 严格日期校验:
    • 使用dd/MM/yyyy格式(注意MM代表月份,避免和分钟mm混淆)
    • 开启setLenient(false),拒绝所有不合法的日期(比如月份13、32号、非闰年的2月29日等)
  3. 高效前置过滤:先检查字符串长度和分隔符位置,避免对明显不符合格式的字符串做解析操作
  4. 适配"开头为日期"规则: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:05:29