Java 如何在SimpleDataFormat中找出解析异常的实际原因?
我有一个字符串形式的日期,我正在使用Java 如何在SimpleDataFormat中找出解析异常的实际原因?,java,simpledateformat,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
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:不可解析的日期:
我想知道到底是什么导致了这个问题,这样我就可以向调用这个方法的人发送一条合适的消息。但是,当异常发生时,我无法知道到底是什么导致了它(是无效格式还是错误值或其他原因)
我可以使用RegEx检查格式是否正确,但是SimpleDateFormat
已经在内部处理该检查。所以我不想再做同样的事了
有没有办法让我知道是什么原因导致了异常?我怀疑有无数种方法可以使日期格式错误。总的来说,如果有足够的时间,我们的代码可能会经历所有这些 您可能会发现最简单(最好?)的方法就是在错误消息中包含格式错误的日期,这样用户就可以看到他们做错了什么 编辑:小心避开输入的值,以免在系统中引入XSS或类似漏洞。javadoc for
parse
方法,它是这样说的:
解析给定字符串开头的文本以生成日期。
该方法不能使用给定字符串的整个文本
ParseException-如果无法分析指定字符串的开头
一旦发现字符串无法解析,它就会抛出ParseException
。由于它从不解析完整的字符串(除非在解析最后一个字符时抛出ParseException
),因此您不知道它失败的确切原因(即它是无效的格式
还是无效的日期
)
最接近它的方法是,通过将
lenient
设置为false
和不设置lenient
来解析date
。如果前者引发异常,但后者正常工作,如果需要知道确切原因,您可以确定它是无效的date
,而不是format
,然后您需要编写自己的解析器。您可以使用setLenient
来确定它是格式问题还是无效日期。java.time.DateTimeFormatter
和java.time
类中的parse
方法往往会给出更多信息丰富的错误消息。不过,我想我还是不想把这些信息传递给普通用户。这也是ParseException
通常也会做的事情(包括有问题的文本),例如java.text.ParseException:Unparseable date:“ABC”
。还要注意ParseException.getErrorOffset()
,指示字符串中发现第一个错误的位置。它仍然没有您真正想要的那么多信息,因为有太多的方式可以使文本格式错误。