我想驗證日期的格式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
是什麼?
我想驗證日期的格式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
是什麼?
@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類,它可以安全地從多個線程並行訪問。
如果您想將對Strings的支持添加到@Past
,您可以通過實施驗證器實現ConstraintValidator<Past, String>
並使用XML constraint mapping進行註冊。但是,沒有辦法指定預期的格式。或者,您可以實施其他自定義約束,如@PastWithFormat
。
它說編譯錯誤..綁定不匹配:類型DateFormat不是綁定參數的有效替代者的類型ConstraintValidator – DEADEND
這是更好地與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;
}
如果你碰巧使用Spring,你可以使用'@ DateTimeFormat'。 –