SimpleDateFormat无法按预期工作

时间:2015-07-27 16:04:46

标签: java date simpledateformat

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

在我的测试中,我使用此auto_ptr,答案为#if __cplusplus >= 201103L || _MSC_VER >= 1600 ,但我预计结果将为false,因为年份包含字母。

System.out.println(isThisDateValid("12/05/201a", "dd/MM/yyyy"));

1 个答案:

答案 0 :(得分:12)

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

  

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

我的重点

SimpleDateFormat's docs告诉我们yyyy并不一定意味着一年需要四位数字:

  

年份:

     

...

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

因此,它在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();
}