Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要验证日期的帮助吗_Java_Date_Simpledateformat - Fatal编程技术网

Java 需要验证日期的帮助吗

Java 需要验证日期的帮助吗,java,date,simpledateformat,Java,Date,Simpledateformat,我有下面的代码,它工作得很好,除非您输入类似于2011年2月2日的内容,您会收到错误消息“文档日期不是有效日期”。我希望它会说“文档日期需要采用MM/DD/YYYY格式” 为什么行newDate=dateFormat.parse(date)不明白吗 // checks to see if the document date entered is valid private String isValidDate(String date) { // set the date

我有下面的代码,它工作得很好,除非您输入类似于2011年2月2日的内容,您会收到错误消息“文档日期不是有效日期”。我希望它会说“文档日期需要采用MM/DD/YYYY格式”

为什么行
newDate=dateFormat.parse(date)不明白吗

// checks to see if the document date entered is valid
    private String isValidDate(String date) {

        // set the date format as mm/dd/yyyy
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
        Date newDate = null;

        // make sure the date is in the correct format..        
        if(!date.equals("mm/dd/yyyy")) {
            try {
                newDate = dateFormat.parse(date);
            } catch(ParseException e) {
                return "The Document Date needs to be in the format MM/DD/YYYY\n";
            }

            // make sure the date is a valid date..
            if(!dateFormat.format(newDate).toUpperCase().equals(date.toUpperCase())) {
                return "The Document Date is not a valid date\n";
            }

            return "true";
        } else {
            return "- Document Date\n";
        }
    }

编辑:我试图严格遵守MM/DD/YYYY格式。如何更改代码,以便如果用户输入“2/2/2011”,它将显示消息:“文档日期需要采用MM/DD/YYYY格式”

日期是正确的,但它将被格式化为02/02/2002

正如前面提到的,
SimpleDataFormat
能够解析“2/2/2011”,就好像它是“02/02/2011”。因此不会抛出
ParseException

另一方面,
dateFormat.format(newDate)
将返回“02/02/2011”,并与“2/2/2011”进行比较。这两个字符串不相等,因此返回第二条错误消息

setLenient(false)
在这种情况下不起作用:

月份:如果模式字母的数量为3个或更多,则将月份解释为文本;否则,它将被解释为一个数字

数字:对于格式化,图案字母的数量是最小位数,较短的数字将被零填充到此数量。对于解析,除非需要分隔两个相邻字段,否则将忽略模式字母的数量

(来源:)

可以使用正则表达式手动检查字符串格式:

if(date.matches("[0-9]{2}/[0-9]{2}/[0-9]{4}")) {
    // parse the date
} else {
    // error: wrong format
}

这段代码中的很多都没有做任何有用的事情。可以提供一个更简单的代码示例,因为我很想删除大部分代码。
2
是有效的一年,因此我不希望它产生错误,我希望它的格式为
02/02/0002
,这与
2/2/2
不同,即使2011年6月1日也会失败。它应该是2011年2月2日。我已经更新了它。它将按照您指定的格式设置为
02/02/2011
,因此不匹配。不匹配。它给出消息“文档日期不是有效日期”。我希望它会给出这样一个信息:“文档日期需要采用MM/DD/YYYY格式”。我知道,这就是问题所在。我希望错误消息显示的格式应该是什么,而不是它是一个无效的日期。如果我没记错的话,日期甚至是公元2年的2月2日,不是吗?@Catfish:那么你必须用正则表达式检查字符串。如果SimpleDataFormat能够解析字符串,那么它只是简单地解析字符串,而不会引发异常。那么,您返回的是错误消息,而不是引发异常(没有引发异常)的消息。我一定不明白日期到底是怎么回事。我认为它验证了它的格式是正确的。不幸的是你没有。解析器实际上相当聪明,能够识别最奇怪的字符串。我刚刚成功地解析了字符串“021111/0211111/2011111111”(通过宽松解析,通过严格解析,将引发ParseException)。这有助于充分利用格式错误的用户输入,但在您的情况下非常糟糕。+1。如果
SimpleDateFormat
文档能够澄清
SimpleDateFormat#parse()
方法本身的宽松行为,那就太好了,因为它实际上取代了
DateFormat#parse()
的文档(甚至违反了合同)。也就是说,除非我对“严格”的解释(如
DateFormat\parse()
所述)是错误的。。。好。。。严格的似乎在这个上下文中,“严格”的意思是“比宽容稍微轻一点”。我无法找到宽松解析和严格解析的确切区别的定义,就像这样的例子,我放弃了通过实验来找出它。