private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
public static boolean checkDate(String sourceDate) {
try {
dateFormat.setLenient(false);
dateFormat.parse(sourceDate);
return true;
} catch (Exception e) {
return false;
}
}
输入日期2010-09-31报错,没有问题。
但输入2010-09-3a,能通过.java认为是 2010-09-03号,也就是最后一位只要输入其它字符,都可以通过。
java为什么这样设计、看了源代码,也没看出个所以然来。
这个也是无意中发现的,我可以对最后一位进行判断Character.isDigit(sourceDate.charAt(sourceDate.length() - 1))
只是想不通java为啥这样做?
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class DateTest { public static void main(String[] args) {
String date = "2010-09-30";
// String date = "2010-09-31";
// String date = "2010-09-3a"; try {
if(checkDate(date)){
System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(date));
} else {
System.out.println("格式错误");
}
} catch (ParseException e) {
e.printStackTrace();
}
} private static boolean checkDate(String checkValue) {
String eL = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))";
Pattern p = Pattern.compile(eL);
Matcher m = p.matcher(checkValue);
boolean b = m.matches();
if (b) {
return true;
} else {
return false;
} }
}