将日期与三种日期格式相匹配:
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Test {
public static void main(String[] args) {
validateDateFormat("2010-01-01 22:kk");
}
/**
* Checks if the date is valid or not.
*
* @param stringDate
* @return date format of the string date passed.
*/
private static String validateDateFormat(String stringDate) {
String dateFormat = "";
/**
* Set the permissible formats.
*/
String[] permissFormats = new String[]{"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd", "yyyy-MM-dd HH:mm"};
/**
* Loop through array of formats and validate using JAVA API.
*/
for (int i = 0; i < permissFormats.length; i++) {
try {
SimpleDateFormat sdfObj = new SimpleDateFormat(permissFormats[i]);
sdfObj.setLenient(true);
sdfObj.parse(stringDate);
dateFormat = permissFormats[i];
System.out.println("the parsed date "
+ "format is "+dateFormat);
break;
} catch (ParseException e) {
if (i == permissFormats.length - 1) {
System.out.println("Parse Exception: DateFormat for "
+ "Date Value :" + stringDate + " is invalid" + e);
}
}
}
return dateFormat;
}
}
输出:
the parsed date format is yyyy-MM-dd
如果给出了如何完全匹配格式?
答案 0 :(得分:3)
你有一个宽松的解析设置为true:
sdfObj.setLenient(true);
public void setLenient(boolean lenient)
指定日期/时间解析是否宽松。同 宽松解析,解析器可以使用启发式来解释输入 与该对象的格式不完全匹配。通过严格的解析, 输入必须与此对象的格式匹配。
还要注意DateFormat#parse个文档说:
该方法可能不会使用给定字符串的整个文本。
编辑:回答您的评论
或者,您可以简单地使用DateValidator进行strcit解析:
DateValidator v = new DateValidator(true, DateFormat.FULL);
v.validate(value, pattern);
如果有效, validate()
会返回已解析的Date
,如果无效,则会返回null
。
答案 1 :(得分:1)
因为在这里不是最后一个数组元素时忽略了异常:
if (i == permissFormats.length - 1) {
如果你这样做:
} catch (ParseException e) {
System.out.println("Parse Exception: DateFormat for " + "Date Value :" + stringDate + " is invalid" + e);
}
将抛出:
Parse Exception: DateFormat for Date Value :2010-01-01 22:kk is invalidjava.text.ParseException: Unparseable date: "2010-01-01 22:kk"
the parsed date format is yyyy-MM-dd
已更正,如果您执行:
validateDateFormat("2010-01-01 22:00:00");
将回答:
the parsed date format is yyyy-MM-dd HH:mm:ss
然后如何匹配整个字符串。
if (permissFormats[i].length == stringDate.length) {
SimpleDateFormat sdfObj = new SimpleDateFormat(permissFormats[i]);
sdfObj.setLenient(true);
sdfObj.parse(stringDate);
}