2013-07-09 68 views
3

我想驗證日期的格式YYYY-MM-DD_hh:mm:ss驗證日期 - Bean驗證註解 - 與特定格式

@Past //validates for a date that is present or past. But what are the formats it accepts 

如果那是不可能的,我想用@Pattern。但@Pattern中使用上述格式的regex是什麼?

+1

如果你碰巧使用Spring,你可以使用'@ DateTimeFormat'。 –

回答

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類,它可以安全地從多個線程並行訪問。

如果您想將對Strings的支持添加到@Past,您可以通過實施驗證器實現ConstraintValidator<Past, String>並使用XML constraint mapping進行註冊。但是,沒有辦法指定預期的格式。或者,您可以實施其他自定義約束,如@PastWithFormat

+0

它說編譯錯誤..綁定不匹配:類型DateFormat不是綁定參數的有效替代者的類型ConstraintValidator DEADEND

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; 
}