对"yyyyMM"与"yyyyMMdd"类日期的校验

        最近在工作中需要用到对"yyyyMM"类的日期校验,比如"201501"就表示2015年1月,然后如果是"201513",“2015qew”等这些这是非法的输入。

       之前使用了一直方式校验,使用SimpleDateFormat类的parse()方法,该方法会抛出ParseException异常,如果parse不符合format,就会抛出该异常。但后来发现了一个问题,就是这种方法对于"yyyy-MM","yyyy-MM-dd"类格式还可用,但到了"yyyyMM"类的就会出现问题,下面用代码说明:

public class Test {
   private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM") ;
	
   public static void main(String[] args) {
	   String testCase1 = "201501";
	   String testCase2 = "201513234";
	   String testCase3 = "2015qew";
	   try {
		  sdf.parse(testCase1) ;
		  System.out.println("'"+testCase1+"'没有发生异常");
		  sdf.parse(testCase2) ;
		  System.out.println("'"+testCase2+"'没有发生异常");
		  sdf.parse(testCase3) ;
		  System.out.println("'"+testCase3+"'没有发生异常");
	   } catch (ParseException e) {
		  System.out.println("发生了异常");
	   }
   }
}

 运行结果如下:

'201501'没有发生异常

'201513234'没有发生异常

发生了异常

从上面可以看出,"201513234"不符合"yyyyMM"形式,但依然没出现异常,在"201501"才出现异常,因此这种方式判断日期格式不安全。

为此,我们可以使用下面一个方法:

 /**
    * 判断时间格式是否是"yyyyMM"或者"yyyyMMdd"
    * @param date   字符串类型时间
    * @param format 时间格式
    * @return
    */
   public static boolean isDate(String date , String format){
       try {
           SimpleDateFormat sdf = new SimpleDateFormat(format);
           Date d =  sdf.parse(date); //把字符串转化为日期(可以过滤掉奇怪格式的日期格式)
           String newDate = sdf.format(d);//日期转化为字符

           /*
            *1,把字符串的日期转化为Date类型的日期。
            *2,把Date类型日期转化为字符串类型日期。
            *3,如果两者相等,说明日期格式符合要求
            */
           if(null != newDate && newDate.equals(date)){
               return true ;
           }else {
               return false ;
           }
       } catch (ParseException e) {
           //出现异常,说明时间格式有误
           return false ;
       }

   }

 测试:

 public static void main(String[] args) {
	   String testCase1 = "201501";
	   String testCase2 = "201513234";
	   String testCase3 = "2015qew";
	   
	   System.out.println(isDate(testCase1,"yyyyMM"));
	   System.out.println(isDate(testCase2,"yyyyMM"));
	   System.out.println(isDate(testCase3,"yyyyMM"));
	   
   }

 

运行结果:

true

false

false

猜你喜欢

转载自gaaidou.iteye.com/blog/2226437
今日推荐