如何根据多个模式验证输入日期



在我的 jsf 应用程序中,我知道如何使用 jsf 转换器根据ice:selectInputDate中的一个模式验证用户输入:

   <f:convertDateTime pattern="MM/dd/yyyy"  />

但是,如果我想让用户也能够以"MM-dd-yyyy"的格式输入日期,我该怎么办?

我认为这可以从 jsf 扩展 DateConverter,但我已经尝试过了,但我失败了。您是否有一个有效的示例来验证针对多种模式的输入日期?

谢谢。

更新:我正在使用 jsf 1.2

创建一个自定义转换器,该转换器通过<f:attribute>组件来接受多种模式。

以下是您希望视图的外观:

<h:inputText id="input" value="#{bean.date}">
    <f:converter converterId="multiDateConverter" />
    <f:attribute name="pattern1" value="MM/dd/yyyy" />
    <f:attribute name="pattern2" value="MM-dd-yyyy" />
</h:inputText>
以下是

转换器的外观(对于 JSF 1.x,将其注册为

<converter-id>multiDateConverter</converter-id>

代替faces-config.xml

@FacesConverter(value="multiDateConverter")
public class MultiDateConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
        List<String> patterns = getPatterns(component);
        Date date = null;
        for (String pattern : patterns) {
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            sdf.setLenient(false); // Don't parse dates like 33-33-3333.
            try {
                date = sdf.parse(value);
                break;
            } catch (ParseException ignore) {
                //
            }
        }
        if (date == null) {
            throw new ConverterException(new FacesMessage("Invalid date format, must match either of " + patterns));
        }
        return date;
    }
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
        return new SimpleDateFormat(getPatterns(component).get(0)).format((Date) value);
    }
    private static List<String> getPatterns(UIComponent component) {
        List<String> patterns = new ArrayList<String>();
        for (int i = 1; i < Integer.MAX_VALUE; i++) {
            String pattern = (String) component.getAttributes().get("pattern" + i);
            if (pattern != null) {
                patterns.add(pattern);
            } else {
                break;
            }
        }
        if (patterns.isEmpty()) {
            throw new IllegalArgumentException("Please provide <f:attribute name="patternX"> where X is the order number");
        }
        return patterns;
    }
}

请注意,它仅选取第一个(默认)模式来重新显示值。所以在上面的示例中,如果你输入 05-10-2011 ,那么它会重新显示为 05/10/2011 .


与具体问题无关,模式MM-dd-yyyy不是很常见。你不是说要用dd-MM-yyyy吗?

相关内容

  • 没有找到相关文章