我正在开展一个项目,我需要根据长度和模式验证多个日期。我使用简单的日期格式,发现了很多问题。我的要求是严格允许日期字符串匹配" yyyy / MM / dd"严格限制10个字符。
以下代码未给出各种测试输入字符串的预期结果。
public static boolean checkformat(String dateString){
boolean flag = false;
Date d1 = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
format.setLenient(false);
try {
d1 = format.parse(dateString);
flag=true;
} catch (ParseException ex) {
ex.printStackTrace();
return false;
}
return flag;
}
上面的代码正在返回" true"对于各种输入,如" 99/03/1" (应为0099/03/01)和99/1/1(应为0099/01/1)。由于输入字符串不是来自from,因此我无法在将它们传递给此方法之前执行验证。请建议任何对dateformat都非常严格的实施(" yyyy / MM / dd")。
答案 0 :(得分:1)
我建议您在格式化之前尝试使用正则表达式验证日期。
用户下面的验证代码
public static boolean checkformat(String dateString){
boolean flag = false;
Date d1 = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
format.setLenient(false);
try {
if (dateString.matches("([0-9]{4})/([0-9]{2})/([0-9]{2})")) { // use this regex
d1 = format.parse(dateString);
flag=true;
}
} catch (ParseException ex) {
ex.printStackTrace();
return false;
}
return flag;
}
答案 1 :(得分:0)
好的,首先:你知道你的预期格式。那么为什么只解析它并捕获异常而不是检查前置条件?
if(dateString.size() > 10) {
...
你实际做的不是检查你的输入格式而是解析它 - 虽然方法没有表达这个合同 - 所以,如果您的方法仅用于检查,您可以: 1.使用正则表达式 2. ...? 我知道在网上建议使用SimpleDateFormat的安静很多,但是 - 坦率地说 - 他们错了。 如果我期待给定的格式,例如因为我知道已经对一些用户输入进行了转换,我可以开始解析一个字符串,并考虑到某些内容可能出错,捕获异常。如果我不知道哪种格式传递给我,我就在验证层,这个层不应该尝试执行转换,而是证明转换是有效的。
答案 2 :(得分:0)
您可以尝试使用Java 8及更高版本中的新java.time包。您可以使用它来替换SimpleDateFormat:
public static boolean checkformat(String dateString){
boolean flag = false;
try {
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate);
flag=true;
} catch (DateTimeParseException ex) {
ex.printStackTrace();
return false;
}
return flag;
}
这也会限制价值没有意义(例如月值为18)。
答案 3 :(得分:0)
String[] removeSlashes=new String[3];
removeSlashes = enteredDate.split("/");
if(removeSlashes[0].length()!=4)
throw new IncorrectDateFormatException(); // user defined exception
if(removeSlashes[1].length()!=2)
throw new IncorrectDateFormatException();
if(removeSlashes[2].length()!=2)
throw new IncorrectDateFormatException();
//Then use SimpleDateFormat to verify