【问题标题】:How to force 4 digit year format in <f:convertDateTime>如何在 <f:convertDateTime> 中强制使用 4 位数年份格式
【发布时间】:2012-06-16 20:21:17
【问题描述】:

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

【问题讨论】:

  • &lt;f:convertDateTime/&gt; 使用java.text.SimpleDateFormat,因此它将使用您通过pattern 属性指定的任何SimpleDateFormat 兼容模式。如果您想要两位数的年份,请使用mm/dd/yy。如果您希望该字段支持多种格式,那么标准的&lt;f:convertDateTime/&gt; 转换器不是您想要的。我不知道有任何多格式转换器,但我不明白为什么不能完成。不过对我来说这听起来有点好笑。将年份转换为 4 位数年份有什么问题?

标签: date jsf-2 converter


【解决方案1】:

这不是错误。这就是SimpleDateFormat 的工作原理。这是来自链接的 javadoc 的相关引用:

  • 年份:如果格式化程序的Calendar 是公历,则应用以下规则。
    • ...
    • 对于解析,如果模式字母的数量超过 2 个,则按字面解释年份,而不考虑位数。因此,使用“MM/dd/yyyy”、“01/11/12”模式会解析到公元 12 年 1 月 11 日
    • ...

JSF &lt;f:convertDateTime&gt; 只是在幕后使用它。最好的办法是扩展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(月)。

【讨论】:

  • 我会像你举例的那样扩展转换器,谢谢! BalusC!
  • @user1413819 如果这对您的问题有用,别忘了mark this post as an answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多