我想验证格式YYYY-MM-DD_hh:mm:ss
@Past //validates for a date that is present or past. But what are the formats it accepts
如果那不可能,我想使用@Pattern
。但是在regex
中使用上述格式的@Pattern
是什么?
答案 0 :(得分:3)
@Past
仅支持Date
和Calendar
,但不支持字符串,因此没有日期格式的概念。
您可以创建一个自定义约束,例如@DateFormat
,以确保给定字符串符合给定的日期格式,并使用如下约束实现:
public class DateFormatValidatorForString
implements ConstraintValidator<DateFormat, String> {
private String format;
public void initialize(DateFormat constraintAnnotation) {
format = constraintAnnotation.value();
}
public boolean isValid(
String date,
ConstraintValidatorContext constraintValidatorContext) {
if ( date == null ) {
return true;
}
DateFormat dateFormat = new SimpleDateFormat( format );
dateFormat.setLenient( false );
try {
dateFormat.parse(date);
return true;
}
catch (ParseException e) {
return false;
}
}
}
请注意,SimpleDateFormat
实例不能存储在验证程序类的实例变量中,因为它不是线程安全的。或者,您可以使用commons-lang项目中的FastDateFormat类,它可以安全地从多个线程并行访问。
如果您想将字符串支持添加到@Past
,可以通过实现ConstraintValidator<Past, String>
实现验证并使用XML constraint mapping注册来实现。但是,没有办法指定预期的格式。或者,您可以实现另一个自定义约束,例如@PastWithFormat
。
答案 1 :(得分:2)
最好尝试使用SimpleDateFormat
解析日期boolean isValid(String date) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'_'HH:mm:ss");
df.setLenient(false);
try {
df.parse(date);
} catch (ParseException e) {
return false;
}
return true;
}