这不是错误。这就是SimpleDateFormat
工作原理。这是来自链接的 javadoc 的相关引用:
- Year:如果格式化程序
Calendar
是公历,则应用以下规则。
- ...
- 对于解析,如果模式字母的数量超过 2 个,则按字面解释年份,而不考虑位数。所以使用模式 "MM/dd/yyyy", "01/11/12" 解析到公元 12 年 1 月 11 日
- ...
JSF<f:convertDateTime>
只是在幕后使用它。您最好的选择是DateTimeConverter
在传递到 real 之前扩展并验证提交值的长度DateTimeConverter
。您不能到处创建自定义转换器,但它毕竟相当简单。
@FacesConverter("myDateTimeConverter")
public class MyDateTimeConverter extends DateTimeConverter {
public MyDateTimeConverter() {
setPattern("MM/dd/yyyy");
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && value.length() != getPattern().length()) {
throw new ConverterException("Invalid format");
}
return super.getAsObject(context, component, value);
}
}
按如下方式使用它:
<h:inputText ... converterMessage="Please enter date in MM/dd/yyyy format">
<f:converter converterId="myDateTimeConverter" />
</h:inputText>
请注意,我mm
将模式中的(分钟)固定为MM
(月)。