我有一个字符串形式的日期,我使用SimpleDateFormat
进行验证。
我有以下代码:
public boolean validateDate(String date) {
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
format.setLenient(false);
try {
Date dt = format.parse(date);
logger.info("DT:\t" + dt.toString());
String actDate = format.format(dt);
logger.info("actDate:\t" + actDate);
return actDate.equals(date);
} catch (ParseException e) {
e.printStackTrace();
}
return false;
}
现在,如果我发送没有相同格式的值,我的格式化程序期望(例如 29-03--2008 )或者值错误的闰年(例如 29-02-2007 ),我得到java.text.ParseException: Unparseable date:
我希望能够知道究竟是什么导致了这个问题,以便我可以将相应的消息发送回调用该方法的消息。但是,当异常发生时,我无法知道究竟是什么导致它(无论是无效格式还是不正确的值或其他东西)。
我可以使用RegEx检查格式是否正确,但SimpleDateFormat
已在内部处理该检查。所以我不想再做同样的事了。
我有什么方法可以知道导致异常的原因吗?
答案 0 :(得分:1)
我怀疑几乎有无数种方式可以错误地格式化日期。总的来说,如果有足够的时间,我们的代码可能会经历所有这些代码。
您可能会发现最简单(最好?)的方法只是在错误消息中包含格式错误的日期,以便用户可以看到他们做错了什么。
修改:注意转义输入的值,以免在系统中引入XSS或类似漏洞。
答案 1 :(得分:0)
Here's parse
方法的javadoc,这就是它所说的:
从给定字符串的开头解析文本以生成日期。 该方法可能不会使用给定字符串的整个文本。
ParseException - 如果无法解析指定字符串的开头。
一旦发现无法解析字符串,就会抛出ParseException
。因为它永远不会解析完整的String(除非在解析最后一个字符时它被抛出ParseException
),否则你不会知道它失败的确切原因(即它是无效的format
还是无效的date
)。
最接近你可以通过在date
设置lenient
和不设置false
的情况下解析date
。如果前者抛出异常但后者工作正常,您可以确定它无效format
而不是{{1}}。