验证日期 - Bean验证注释 - 使用特定格式

时间:2013-07-09 04:07:03

标签: java date design-patterns format bean-validation

我想验证格式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是什么?

2 个答案:

答案 0 :(得分:3)

@Past仅支持DateCalendar,但不支持字符串,因此没有日期格式的概念。

您可以创建一个自定义约束,例如@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;
}