我正在使用以下代码对文本输入的数据类型是否为日期进行分类:

private boolean isDate(String val)
{
    //These are the only formats dates will have
    String[] formatList = {"MM/dd/yyyy", "MM-dd-yyyy", "MMM/dd/yyyy", "dd-MMM-yyyy"};
    SimpleDateFormat dateFormat = new SimpleDateFormat();
    dateFormat.setLenient(false);
    dateFormat.

    //Loop through formats in formatList, and if one matches the string return true
    for (String str:formatList)
    {
        try
        {
            dateFormat.applyPattern(str);
            dateFormat.parse(val.trim());
        } catch (ParseException pe)
        {
            continue;
        }
        return true;
    }
    return false;
}


在switch语句中会与其他函数(如isNumber,isDatetime,isVarchar2等)一起调用此方法。当我传递值“ 4/05/2013 23:54”(即日期时间)时,SimpleDateFormat对象成功解析了该方法。我认为这是因为它执行了正则表达式匹配。这意味着我必须在isDatetime之后调用isDate,否则将不会被归类为日期时间。是否有一种简单的方法来使SimpleDateFormat严格匹配(即,在有多余字符时阻塞)?

最佳答案

我想仅以一种模式使用Java8 +中的java.time API:

private boolean isDate(String dateString) {
    DateTimeFormatter format =
            DateTimeFormatter.ofPattern(
                    "[M/d/uuuu][M-d-uuuu][MMM/d/uuuu][d-MMM-uuuu]"
            );
    try {
        LocalDate.parse(dateString, format);
        return true;
    }catch (DateTimeParseException e){
        return false;
    }
}




其中[M/d/uuuu][M-d-uuuu][MMM/d/uuuu][d-MMM-uuuu]表示匹配M/d/uuuuM-d-uuuuMMM/d/uuuud-MMM-uuuu

08-17 10:57