我有下面的代码并且它工作得非常好,除非您输入类似于2/2/2011的内容,您会收到错误消息“文档日期不是有效日期”。我希望它会说“文件日期需要采用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格式”?
答案 0 :(得分:4)
如前所述,SimpleDateFormat
能够解析“2/2/2011”,就像它是“02/02/2011”一样。所以没有抛出ParseException
。
另一方面,dateFormat.format(newDate)
将返回“02/02/2011”并与“2/2/2011”进行比较。这两个字符串不相等,因此返回第二条错误消息。
setLenient(false)
在这种情况下不起作用:
月:如果模式字母的数量为3或更多,则将月份解释为文本; 否则,它被解释为数字。
数字:对于格式化,模式字母的数量是最小位数,较短的数字是零填充到此数量。 对于解析,除非需要分隔两个相邻字段,否则将忽略模式字母的数量。
(来源:java docs)
您可以使用正则表达式手动检查字符串格式:
if(date.matches("[0-9]{2}/[0-9]{2}/[0-9]{4}")) {
// parse the date
} else {
// error: wrong format
}
答案 1 :(得分:0)
日期正确,但格式为02/02/2002