我正在使用JSF 2.0和RichFaces 4.对于日期输入,我试图强制模式mm/dd/yyyy
。
<h:inputText value="#{bean.startDate}">
<f:convertDateTime pattern="mm/dd/yyyy"/>
</h:inputText>
当用户实际输入的日期为2位数年份mm/dd/yy
时,转换器会自动将年份转换为4位数。这是不希望的。如何在不创建自定义转换器的情况下阻止它这样做?这是JSF转换器中的错误吗?
答案 0 :(得分:6)
这不是错误。这就是SimpleDateFormat
的工作原理。以下是链接javadoc的相关内容:
- 年度:如果格式化程序的
Calendar
是公历,则应用以下规则。
- ...
- 对于解析,如果模式字母的数量大于2,则无论数字位数如何,都按字面解释年份。所以使用“MM / dd / yyyy”模式,“01/11/12”解析到1月11日,12 A.D。
- ...
JSF <f:convertDateTime>
正在使用它。最好的办法是扩展DateTimeConverter
并验证提交值的长度,然后再转到真实的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
(月)。