如何在<f:convertdatetime> </f:convertdatetime>中强制使用4位数年份格式

时间:2012-06-13 19:49:54

标签: date jsf-2 converter

我正在使用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转换器中的错误吗?

1 个答案:

答案 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(月)。