SimpleDateFormat无法按预期工作

kak*_*shy 5 java date simpledateformat

我尝试使用这个功能,但它不适用于这种情况'12/05/201a'有人知道为什么会发生这种情况?

在我的测试中,我使用了这个 System.out.println(isThisDateValid("12/05/201a", "dd/MM/yyyy"));,答案是,true但我预计结果将是假的,因为年份包含字母.

 public static boolean isThisDateValid(String dateToValidate, String dateFromat)
    {

        if (dateToValidate == null)
        {
            return false;
        }

        SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
        sdf.setLenient(false);

        try
        {

            //if not valid, it will throw ParseException
            Date date = sdf.parse(dateToValidate);
            System.out.println(date);

        } catch (ParseException e)
        {

            e.printStackTrace();
            return false;
        }

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 12

DateFormat#parse 不一定使用整个字符串:

从给定字符串的开头解析文本以生成日期.该方法可能不使用给定字符串的整个文本.

(我的重点)

SimpleDateFormat的文档告诉我们,yyyy并不一定意味着一年需要四位数:

年:

...

  • 对于解析,如果模式字母的数量大于2,则无论数字位数如何,都按字面解释年份.因此,使用该模式"MM/dd/yyyy","01/11/12"解析到公元12年1月11日

因此,它在201年解析该字符串是正确的(如果可能令人惊讶).

您可以使用parse(String,ParsePosition)来确定整个字符串是否已被使用,或者在解析之前使用正则表达式对其进行验证.这是一个将检查整个字符串是否已被解析的版本,而不仅仅是第一个字符:

public static boolean isThisDateValid(String dateToValidate, String dateFormat) {
    if (dateToValidate == null) {
        return false;
    }

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    sdf.setLenient(false);

    ParsePosition position = new ParsePosition(0);
    Date date = sdf.parse(dateToValidate, position);
    return date != null && position.getIndex() == dateToValidate.length();
}
Run Code Online (Sandbox Code Playgroud)