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)
| 归档时间: |
|
| 查看次数: |
893 次 |
| 最近记录: |