将字符串转换为日期 - 日期验证

时间:2011-12-19 13:31:34

标签: java regex validation date-format

当用户以错误的格式输入日期时,我收到空指针异常。

将字符串转换为日期的方法

 Date stringToDate(String dateString) {

        Date returnDate = null;
        if (dateString!= null && dateString.length() > 0 && isValidDate(dateString)) {
            returnDate = dateFormat.parse(dateStr);
        }
        return returnDate;
    }

boolean isValidDate(String date) {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");  
    Pattern datePattern = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}");
    Matcher datePatternMatch = datePattern.matcher(date);

    boolean datePatternMatchfound = datePatternMatch.matches();

    if(date==null){
        return false;
    } else if(date!=null && date.length()>0){       
        if(datePatternMatchfound){
            sdf.setLenient(false);
            sdf.parse(date.trim());
        }
        return true;
    } else {
        return false;
    }  
}

我很想知道......

1)什么应该是有效的日期模式?

2)如果用户输入错误的日期stringToDate方法肯定会失败并抛出空指针异常。如何避免?

真的很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

有一件事是你需要在验证方法中更加防守。

在您显示的代码中,您执行此操作:

Matcher datePatternMatch = datePattern.matcher(date);

在检查日期String是否为null之前。 Pattern.matcher(null)导致NullPointerException。

因此,您需要在if (date != null)条件块中移动此代码。

除此之外,在使用DateFormat验证之前,我没有看到使用正则表达式验证日期字符串的好处。正则表达式验证不会给你任何额外的好处。

答案 1 :(得分:0)

通过使用Simple date format类,我们可以验证string是否为日期。您需要确保将setLenient(false)设置为simple date format对象。

如果未设置,则通过舍入值最终会出现问题。例如,宽松的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日。

示例代码:

http://www.vijayakumarg.co.in/2014/04/how-to-validate-date-string-in-java.html

public static boolean validateJavaDate(String strDate)
{

    /*
     * Set preferred date format,
     * For example MM-dd-yyyy, MM.dd.yyyy,dd.MM.yyyy etc.*/
    SimpleDateFormat sdfrmt = new SimpleDateFormat("MM/dd/yyyy");
    sdfrmt.setLenient(false);
    /* Create Date object */
    Date javaDate = null;
    /* parse the string into date form */
    try
    {
        javaDate = sdfrmt.parse(strDate);
        System.out.println("Date after validation: " + javaDate);
    }
    /* Date format is invalid */
    catch (ParseException e)
    {
       System.out.println("The date you provided is in an " +"invalid date format.");
       return false;
    }
    /* Return 'true' - since date is in valid format */
    return true;

}