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为什么这样设计、看了源代码,也没看出个所以然来。

解决方案 »

  1.   

    自己写一个算了。SimpleDateFormat是不太行
      

  2.   

    这样有什么不好吗?我主要觉得方便,正则不会写,网上找的还要做测试。
    这个也是无意中发现的,我可以对最后一位进行判断Character.isDigit(sourceDate.charAt(sourceDate.length() - 1))
    只是想不通java为啥这样做?
      

  3.   

    import java.text.ParseException;
    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;
    } }
    }
      

  4.   

    SimpleDateFormat 这个类是用来格式化的,不是用来验证格式的。这样设计是最好的!如果要写验证的话,那么用正则吧!这个叫各有所用!就像饭勺跟锅铲,你会用哪个盛饭?虽然锅铲也能盛饭!