我尝试使用此功能,但它不适用于此情况'12 / 05 / 201a'有人知道为什么会发生这种情况?
在我的测试中,我使用此auto_ptr
,答案为#if __cplusplus >= 201103L || _MSC_VER >= 1600
,但我预计结果将为false,因为年份包含字母。
System.out.println(isThisDateValid("12/05/201a", "dd/MM/yyyy"));
答案 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();
}