3

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

4

1 回答 1

8

这不是错误。这就是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(月)。

于 2012-06-19T18:44:10.027 回答