如何在SimpleDateFormat中找出解析异常的实际原因?

时间:2017-05-17 22:34:23

标签: java simpledateformat

我有一个字符串形式的日期,我使用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已在内部处理该检查。所以我不想再做同样的事了。

我有什么方法可以知道导致异常的原因吗?

2 个答案:

答案 0 :(得分:1)

我怀疑几乎有无数种方式可以错误地格式化日期。总的来说,如果有足够的时间,我们的代码可能会经历所有这些代码。

您可能会发现最简单(最好?)的方法只是在错误消息中包含格式错误的日期,以便用户可以看到他们做错了什么。

修改:注意转义输入的值,以免在系统中引入XSS或类似漏洞。

答案 1 :(得分:0)

Here's parse方法的javadoc,这就是它所说的:

  

从给定字符串的开头解析文本以生成日期。   该方法可能不会使用给定字符串的整个文本。

     

ParseException - 如果无法解析指定字符串的开头。

一旦发现无法解析字符串,就会抛出ParseException。因为它永远不会解析完整的String(除非在解析最后一个字符时它被抛出ParseException),否则你不会知道它失败的确切原因(即它是无效的format还是无效的date)。

最接近你可以通过在date设置lenient和不设置false的情况下解析date。如果前者抛出异常但后者工作正常,您可以确定它无效format而不是{{1}}。