检查日期格式的验证未按预期工作

时间:2015-04-22 21:33:04

标签: java

我有以下代码检查有效的格式日期

private void validateDate(String date){

    try {
        String validDate = "MM/dd/yyyy";    
        SimpleDateFormat format = new SimpleDateFormat(validDate);
        format.setLenient(false);
        Date theDate = new Date();
        theDate = format.parse(date);
    }
    catch (Exception e) {
    }

}  

我将日期值传递给06/25/20014。在今年格式是错误的,我期待它将抛出异常并将进入内部捕获,但它永远不会发生,它成功传递代码format.parse(日期);由于我的应用程序没有抛出错误。

我还调试了行format.parse(date);它返回" Fri Jul 31 00:00:00 MST 20015"。我不确定为什么那条线没有抛出任何异常。

感谢您的帮助!!

4 个答案:

答案 0 :(得分:0)

这实际上是documented behaviour(至少对于公历,我假设您将使用,除非您明确地将其设置为不同的日历):

  

年份:如果格式化程序的日历是阳历,那么   以下规则适用。

     

对于格式化,如果是图案的数量   字母是2,年份被截断为2位数;否则就是   解释为数字。对于解析,如果是模式字母的数量   超过2,年份按字面解释,无论如何   位数

是的,有一天20015可能是有效的一年;)如果你想检查4位数字,你可能要考虑在解析之前使用正则表达式匹配。

答案 1 :(得分:0)

如果此行确实抛出异常,那么您的程序将在9999年后停止工作,这通常不是您想要的。当然,你不希望你的程序持续这么久,但是人们也没想到会持续到y2k;所以Java选择不在任何日期阻止它似乎是合理的。

如果您想检查年份是否在1到9999之间,您只需撰写if :(参见相关问题I want to get Year, Month, Day, etc from Java Date to compare with Gregorian Calendar date in Java. Is this possible?

Calendar cal = Calendar.getInstance();
cal.setTime(date);
if (cal.get(Calendar.YEAR) > 9999)
    throw new RuntimeException("Blah");

答案 2 :(得分:0)

在SimpleDateFormat的标准日期格式中,数字' y'并不一定与数字位数相对应(它不是正则表达式)。一个或两个y是2位数年份(15,98等)的指标,3个或更多y是全年的指标。

答案 3 :(得分:0)

我可以看到提供的日期是有效的(虽然提前18k年)

public static void validateDate(String date){

    try {
        String validDate = "MM/dd/yyyy";    
        SimpleDateFormat format = new SimpleDateFormat(validDate);
        format.setLenient(false);
        Date theDate = format.parse(date);
        Calendar c = new GregorianCalendar();
        c.setTime(theDate);
        int year = c.get(Calendar.YEAR);
        int month  = c.get(Calendar.MONTH);
        int day  = c.get(Calendar.DAY_OF_MONTH);
        int pos = c.get(Calendar.DAY_OF_WEEK);
        if (Calendar.WEDNESDAY == pos) 
          System.out.print("day is Wednesday on " + year + "/" + (month+1) + "/" + day);
    }
    catch (Exception e) {
       System.out.print("Inside exception block " + e);
    }
}

打印:日期是星期三20014/6/25

如果您需要一些年度验证,可以添加额外的检查

if (year > MAX_YEAR) {
  // add error here
}

这是DEMO