在错误的年份输入的情况下,日期验证不起作用

时间:2014-06-12 05:35:05

标签: java validation date

我正在使用以下代码验证日期。代码在几天和几个月内正常工作,但它接受超过5位数的年份值,但是我已指定的格式" yyyy"。

问题:为什么它会在21114的情况下返回 true ,因为它不是我指定格式的有效日期。?

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class raju {

    public static void main(String[] args) {
        boolean a=raju.isThisDateValid("12/12/21114","MM/dd/yyyy");
        System.out.println(a);
    }


    public static boolean isThisDateValid(String dateToValidate, String dateFromat){

        if(dateToValidate == null){
            return false;
        }

        SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
        sdf.setLenient(false);

        try {

            //if not valid, it will throw ParseException
            Date date = sdf.parse(dateToValidate);
            System.out.println(date);

        } catch (ParseException e) {

            e.printStackTrace();
            return false;
        }

        return true;
    }

}

5 个答案:

答案 0 :(得分:2)

来自SimpleDateFormat javadoc,

  

否则,将应用特定于日历系统的表单。对于格式化和解析,如果模式字母的数量是4或更多,则使用日历特定的长形式。否则,将使用日历特定的简短或缩写形式。

对于您似乎想要的行为,您需要检查年份是否小于10000.

答案 1 :(得分:1)

用于解析的格式更多地是关于组件和分隔符的顺序。

我希望不要介意输入在日期或月份中是否省略前导0,即使它明确表示期望2位数。所以这一年也不是严格的数字计数。

在实践中,如果您想检查年份是否有效,您需要再做一步。毕竟在大多数应用程序甚至9999年都没有意义。所以,如果你允许那么为什么不是10k?

<强>除了

Java符合Y10k标准。实际上它是Y1,000,000 complient。它不会解析1/1/10000000(1000万)!

答案 2 :(得分:1)

查看文档,似乎如果未提供您指定的确切位数,则按字面处理该值。

例如:

传入12的“yyyy”将成功解析为12 A.D.(而非2012年)

传入21114的“yyyy”将成功解析为21114 A.D。

答案 3 :(得分:1)

由于您使用的parse(String)类的DateFormat方法由SimpleDateFormat扩展,因此javadoc of parse method读取的内容为:

  

从给定字符串的开头解析文本以生成日期。 该方法可能不会使用给定字符串的整个文本。

parse(String,ParsePosition)的javadoc读取:

  

默认情况下,解析是宽松的:如果输入不是此对象的格式方法使用的形式,但仍可以解析为日期,则解析成功。客户可以通过致电setLenient(false)坚持严格遵守格式。

     

此解析操作使用日历生成日期。因此,日历的日期时间字段和TimeZone值可能已被覆盖,具体取决于子类实现。之前通过调用setTimeZone设置的任何TimeZone值可能需要恢复以进行进一步操作。

答案 4 :(得分:0)

问题在于日期在java中的运行方式,21114是根据java格式为YYYY的有效年份。正如它已经很好地被Westos和bstar55所展示,关于java和日期格式。解决方案可能是添加您自己的验证,以确保日期格式是您需要的方式。例如,如果您需要日期类似于此dd(不超过2位数),月份(不超过2位数)和年份(不超过4位数)

public static void main(String[] args) {
    boolean a= isThisDateValid("12/12/21114","MM/dd/yyyy");
    System.out.println(a);
}


public static boolean isThisDateValid(String dateToValidate, String dateFromat){

    if(dateToValidate == null){
        return false;
    }

    SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
    sdf.setLenient(false);

   String[] Arr=dateToValidate.split("/");

    try {

        if(Arr[0].length()>2 || Arr[1].length()>2 || Arr[2].length()>4){


            throw new ParseException("Error in date: "+dateToValidate,0);
        }
        //if not valid, it will throw ParseException
        Date date = sdf.parse(dateToValidate);
        System.out.println(date);

    } catch (ParseException e) {

        e.printStackTrace();
        return false;
    }

    return true;
}