一、先說一下年月日(yyyy-MM-dd)正則表達式:
1.年月日正則表達式:
^((19|20)[0-9]{2})-((0?2-((0?[1-9])|([1-2][0-9])))|(0?(1|3|5|7|8|10|12)-((0?[1-9])|([1-2][0-9])|(3[0-1])))|(0?(4|6|9|11)-((0?[1-9])|([1-2][0-9])|30)))$
或者這樣,2月中的9可以變化
^((19|20)[0-9]{2})-((0?2-((0?[1-9])|(1[0-9]|2[0-9])))|(0?(1|3|5|7|8|10|12)-((0?[1-9])|([1-2][0-9])|(3[0-1])))|(0?(4|6|9|11)-((0?[1-9])|([1-2][0-9])|30)))$
下面就是JAVA判斷年月日格式是否正確的兩種方法(這兩種方法實現類似)
第一種:先正則判斷,后判斷月份是否2月(再者就是閏年判斷),返回Map
1 /** 2 * 判斷日期 3 * @param date 4 * @return 5 */ 6 public static Map<String,Object> dateIsPass(String date) { 7 Map<String,Object> rsMap = new HashMap<String,Object>(); 8 rsMap.put("format", false); 9 rsMap.put("msg", "日期格式不對。"); 10 //年月日的正則表達式,此次沒有理會2月份閏年 11 String regex = "^((19|20)[0-9]{2})-((0?2-((0?[1-9])|([1-2][0-9])))|(0?(1|3|5|7|8|10|12)-((0?[1-9])|([1-2][0-9])|(3[0-1])))|(0?(4|6|9|11)-((0?[1-9])|([1-2][0-9])|30)))$"; 12 //開始判斷,且符合正則表達式 13 if(date.matches(regex)) { 14 rsMap.put("format", true); 15 rsMap.put("msg", "日期格式正確。"); 16 //分割截取0年份1月份2日 17 String[] dateSplit = date.split("-"); 18 //判斷輸入的月份是否是二月,輸入的是二月的話,還需要判斷該年是否是閏年 19 if("02".equals(dateSplit[1]) || "2".equals(dateSplit[1])) { 20 int year = Integer.parseInt(dateSplit[0]); 21 // 不是閏年,需要判斷日是否大於28 22 if (!(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) { 23 int day = Integer.parseInt(dateSplit[2]); 24 if(day > 28) { 25 rsMap.put("format", false); 26 rsMap.put("msg", year+"年2月不是閏年,只有28天!"); 27 } 28 } 29 } 30 } 31 return rsMap; 32 }
第二種:先判斷月份是否2月(再者就是閏年判斷),后拼湊正則表達式,返回boolean
1 /** 2 * 判斷日期 3 * @param date 4 * @return 5 */ 6 public static boolean dateIsPass2(String date) { 7 boolean flag = false; 8 int d = 8; 9 //分割截取0年份1月份2日 10 String[] dateSplit = date.split("-"); 11 //判斷輸入的月份是否是二月,輸入的是二月的話,還需要判斷該年是否是閏年 12 if("02".equals(dateSplit[1]) || "2".equals(dateSplit[1])) { 13 int year = Integer.parseInt(dateSplit[0]); 14 // 不是閏年,需要判斷日是否大於28 15 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { 16 d = 9; 17 } 18 } 19 //年月日的正則表達式,此次沒有理會2月份閏年 20 String regex = "^((19|20)[0-9]{2})-((0?2-((0?[1-9])|(1[0-9]|2[0-"+d+"])))|(0?(1|3|5|7|8|10|12)-((0?[1-9])|([1-2][0-9])|(3[0-1])))|(0?(4|6|9|11)-((0?[1-9])|([1-2][0-9])|30)"; 21 //開始判斷,且符合正則表達式 22 if(date.matches(regex)) { 23 flag = true; 24 } 25 return flag; 26 }