gpt4 book ai didi

java - 如何针对多种模式验证输入日期?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:34 24 4
gpt4 key购买 nike

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

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

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

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

谢谢。

更新:我正在使用 jsf 1.2

最佳答案

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

下面是您希望 View 的样子:

<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吗? ?

关于java - 如何针对多种模式验证输入日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com