对"yyyyMM"与"yyyyMMdd"类日期的校验 JavaSimpleDateFormat日期校验JavaSE
程序员文章站
2022-05-25 14:46:07
...
最近在工作中需要用到对"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