为什么这个程序没有报告解析异常?

时间:2015-09-28 14:02:39

标签: java date

将日期与三种日期格式相匹配:

import java.text.ParseException;
   import java.text.SimpleDateFormat;

   public class Test {
    public static void main(String[] args) {

    validateDateFormat("2010-01-01 22:kk");
}

/**
 * Checks if the date is valid or not.
 * 
 * @param stringDate
 * @return date format of the string date passed.
 */
private static String validateDateFormat(String stringDate) {
    String dateFormat = "";

    /**
     * Set the permissible formats.
     */
    String[] permissFormats = new String[]{"yyyy-MM-dd HH:mm:ss", 
    "yyyy-MM-dd", "yyyy-MM-dd HH:mm"};

    /**
     * Loop through array of formats and validate using JAVA API.
     */
    for (int i = 0; i < permissFormats.length; i++) {
        try {
            SimpleDateFormat sdfObj = new SimpleDateFormat(permissFormats[i]);
            sdfObj.setLenient(true);
            sdfObj.parse(stringDate);
            dateFormat = permissFormats[i];
            System.out.println("the parsed date "
                    + "format is "+dateFormat);
            break;
        } catch (ParseException e) {
            if (i == permissFormats.length - 1) {
                System.out.println("Parse Exception: DateFormat for "
                        + "Date Value :" + stringDate + " is invalid" + e);
            }
        }
    }

    return dateFormat;

}

}

输出:

the parsed date format is yyyy-MM-dd

如果给出了如何完全匹配格式?

2 个答案:

答案 0 :(得分:3)

你有一个宽松的解析设置为true:

sdfObj.setLenient(true);
  

public void setLenient(boolean lenient)

     

指定日期/时间解析是否宽松。同   宽松解析,解析器可以使用启发式来解释输入   与该对象的格式不完全匹配。通过严格的解析,   输入必须与此对象的格式匹配。

还要注意DateFormat#parse个文档说:

  

该方法可能不会使用给定字符串的整个文本。

编辑:回答您的评论

或者,您可以简单地使用DateValidator进行strcit解析:

DateValidator v = new DateValidator(true, DateFormat.FULL);
v.validate(value, pattern);
如果有效,

validate()会返回已解析的Date,如果无效,则会返回null

答案 1 :(得分:1)

因为在这里不是最后一个数组元素时忽略了异常:

if (i == permissFormats.length - 1) {

如果你这样做:

} catch (ParseException e) {
    System.out.println("Parse Exception: DateFormat for " + "Date Value :" + stringDate + " is invalid" + e);
}

将抛出:

Parse Exception: DateFormat for Date Value :2010-01-01 22:kk is invalidjava.text.ParseException: Unparseable date: "2010-01-01 22:kk"
the parsed date format is yyyy-MM-dd

已更正,如果您执行:

validateDateFormat("2010-01-01 22:00:00");

将回答:

the parsed date format is yyyy-MM-dd HH:mm:ss
  

然后如何匹配整个字符串。

if (permissFormats[i].length == stringDate.length) {
    SimpleDateFormat sdfObj = new SimpleDateFormat(permissFormats[i]);
    sdfObj.setLenient(true);
    sdfObj.parse(stringDate);
}