3

我有我写的这个简单的程序

try{
    SimpleDateFormat sdf = new SimpleDateFormat("M/dd/yyyy");
    sdf.setLenient(false);
    //Date date = sdf.parse("1/14/1999"); Apologies for confusion
    Date date = sdf.parse(request.getParameter("selectedDate"));
}catch(ParseException ex){
    ex.printStackTrace();
}

据我了解,如果日期超出范围或给出的格式错误,则会引发 ParseException。我希望能够将它们区分开来。我怎样才能做到这一点?

编辑:当我说超出范围时,我的意思是 1999 年 15 月 15 日这样的事情。这就是为什么setLenient(false)

4

4 回答 4

2

ParseException没有提供可靠的方法来确定异常本身的原因。您可以在异常块中调用两次parse设置并检查其状态lenienttruefalse

SimpleDateFormat sdf = new SimpleDateFormat("M/dd/yyyy");
try {
    sdf.setLenient(true);
    Date date = sdf.parse("1/33/1999");
    System.out.println("DateFormat is OK");
    sdf.setLenient(false);
    date = sdf.parse("1/33/1999");

} catch (ParseException ex) {
    ex.printStackTrace();
    if (!sdf.isLenient())  {
        System.out.println("Invalid date");
    } else {
        System.out.println("Invalid date pattern");
    }
}
于 2013-06-02T17:09:45.763 回答
1

请看看这些方法。我不擅长例外,但也许它会给你一些帮助。

 try{
  SimpleDateFormat sdf = new SimpleDateFormat("M/dd/yyyy");
  sdf.setLenient(false);
  Date date = sdf.parse("1/14/1999");
}catch(ParseException ex){
ex.printStackTrace();
        System.out.println(ex.toString());//get cause and message ,localized details
        System.out.println(ex.etErrorOffset()); //get position of error

}

于 2013-06-02T17:19:23.323 回答
1

给出的格式是错误的。

如果您的意思是格式无效,那么会引发 IllegalArgumentException,请参见此处

但是您不必检查,您提供的模式是在编译时确定的,您应该能够确保它是有效的;只有在编译时模式未知时才需要进行检查。

于 2013-06-02T17:01:45.253 回答
1

我阅读了文档,发现在这两种情况下抛出了不同的异常,因此您可以根据异常类进行区分:

try {
    SimpleDateFormat sdf = new SimpleDateFormat("M/dd/yyyy");
    sdf.setLenient(false);
    Date date = sdf.parse("1/14/1999");
} catch (IllegalArgumentException ex) {
    // format exception
} catch (ParseException ex) {
    // parse exception
}
于 2013-06-02T17:27:54.320 回答