我正在使用以下模式和日期
日期:2007年13月13日
模式:dd-MM-yyyy
输出:Sun Jan 13 00:00:00 IST 2008或2008-01-13 00:00:00.0
我在这里期待例外。如果给定日期不正确,我该怎么做才能生成异常。
使用DateFormat.setLenient(false)
告诉DateFormat
/ SimpleDateFormat
您希望它是严格的。
设置Lenient适用于大多数情况,但如果你想检查确切的字符串模式,那么这可能会有所帮助,
String s = "03/6/1988";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
try {
sdf.setLenient(false);
Date d = sdf.parse(s);
String s1 = sdf.format(d);
if (s1.equals(s))
System.out.println("Valid");
else
System.out.println("Invalid");
} catch (ParseException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
如果您输入“03/06/1988”,那么您将获得有效的结果。
我想提出现代的答案。当在2011年提出这个问题时,使用SimpleDateFormat
和Date
是合理的。它已经不存在了。这些类总是设计得很差,并且在2014年被现代Java日期和时间API java.time取代,现在已经过时了。
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
String dateString = "13-13-2007";
LocalDate date = LocalDate.parse(dateString, dateFormatter);
此代码提供了您预期的异常(并且有充分的理由期待):
线程“main”中的异常java.time.format.DateTimeParseException:无法解析文本'13 -13-2007':MonthOfYear的值无效(有效值1 - 12):13
请注意并享受准确且信息丰富的异常消息。
DateTimeFormatter
有三种所谓的解析器样式,严格,聪明和宽容。 Smart是默认设置,您很少需要其他任何东西。如果您想确保在所有情况下都能捕获所有无效日期,请使用strict。