问题描述
我想进行日期格式验证。它应该是 yyyy-mm-dd ,为了达到我的要求,我遵循以下代码,但是它不起作用。
我的输入请求应为 2020-13-08 或 2020-13-08T23:00:00Z ,但应为 2020-08-13 或 2020-08-13T23:00:00Z
public static boolean validateJavaDate(String strDate) {
/*
* Set preferred date format,For example MM-dd-yyyy,MM.dd.yyyy,dd.MM.yyyy etc.
*/
SimpleDateFormat sdfrmt = new SimpleDateFormat("yyyy-mm-dd");
sdfrmt.setLenient(false);
try {
Date javaDate = sdfrmt.parse(strDate);
System.out.println(strDate + " is valid date format");
}
catch (ParseException e) {
System.out.println(strDate + " is Invalid Date format");
return false;
}
return true;
}
解决方法
最好使用新的java.time包
public static boolean validateJavaDate(String strDate) {
if (strDate == null || strDate.isEmpty()) { //for completeness
System.out.println("Given value can not be null or empty");
return false;
}
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
try {
formatter.parse(strDate);
System.out.println(strDate + " is valid date format");
return true;
}
catch (DateTimeParseException e) {
System.out.println(strDate + " is Invalid Date format");
return false;
}
}
如果目标是同时验证和不验证时间,那么我们可以将实际的解析提取到私有方法中,并使用不同的格式化程序进行调用
private static boolean formatDate(String string,DateTimeFormatter formatter) {
try {
formatter.parse(string);
return true;
} catch (DateTimeParseException e) {
return false;
}
}
public static boolean validateJavaDate(String strDate) {
if (strDate == null || strDate.isEmpty()) { //for completeness
System.out.println("Given value can not be null or empty");
return false;
}
boolean isValid = formatDate(strDate,DateTimeFormatter.ISO_LOCAL_DATE);
if (!isValid) {
isValid = formatDate(strDate,DateTimeFormatter.ISO_DATE_TIME);
}
if (isValid) {
System.out.println(strDate + " is valid date format");
} else {
System.out.println(strDate + " is Invalid Date format");
}
return isValid;
}
,
yyyy-mm-dd
匹配小时中的分钟(mm
)部分,这就是验证通过的原因。将其替换为yyyy-MM-dd
以匹配月份。有关SimpleDateFormat
的文档,请参见https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/SimpleDateFormat.html。
另一方面,您可以手动进行。
像这样的Somethink
{{1}}