提问人:Joe 提问时间:8/23/2015 最后编辑:durron597Joe 更新时间:8/23/2015 访问量:80
为什么无效日期会成功解析为真实日期?
Why does an invalid date parses successfully as a real date?
问:
有人可以向我解释如何获得以下方法来返回所显示输入的值吗?它回来了,这是我没想到的。false
true
isDateValid("19/06/2012 5:00, 21:00","dd/MM/yyyy HH:mm")
我认为这应该返回,但显然 Java 不这么认为。提供的实际日期字符串末尾包含以下额外字符:.false
", 21:00"
public static boolean isDateValid(String date, String dateFormat)
{
try {
DateFormat df = new SimpleDateFormat(dateFormat);
df.setLenient(false);
Date newDate = df.parse(date);
System.out.println("Date value after checking for validity: " + newDate);
return true;
} catch (ParseException e) {
return false;
}
}
答:
7赞
durron597
8/23/2015
#1
parse
不一定使用整个.这在 Javadoc 中非常清楚,强调我的:String
parse
public Date parse(String source) throws ParseException
分析给定字符串开头的文本以生成日期。该方法不能使用给定字符串的整个文本。有关日期分析的详细信息
,请参阅 parse(String, ParsePosition)
方法。
您可以使用 parse(String text, ParsePosition pos)
检测字符串末尾是否有额外的字符。如果不等于 String 的末尾,则末尾剩余有额外的字符。pos
这是一个工作程序,包括测试台,它将按照您预期的方式正确检查这一点。在这个程序中,如果它根本无法解析,如果末尾有额外的字符,则数字太小,如果它按照你想要的方式工作,则相等pos.getIndex()
0
public class DateFormatTest {
public static void main(String[] args) {
// should be false
System.out.println(isDateValid("19/06/2012 5:00, 21:00", "dd/MM/yyyy HH:mm"));
System.out.println(isDateValid("19/06/201", "dd/MM/yyyy HH:mm"));
System.out.println();
// should be true
System.out.println(isDateValid("19/06/2012 5:00", "dd/MM/yyyy HH:mm"));
}
public static boolean isDateValid(String date, String dateFormat) {
ParsePosition pos = new ParsePosition(0);
DateFormat df = new SimpleDateFormat(dateFormat);
df.setLenient(false);
df.parse(date, pos);
return pos.getIndex() == date.length();
}
}
评论