Java DateFormat:最方便&;根据多种模式验证输入日期的优雅方法

Java DateFormat:最方便&;根据多种模式验证输入日期的优雅方法,java,Java,我现在就是这样做的: ...... DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); try{ dateFormat.parse(criteria.getPeriodFrom()); dateFormat.parse(criteria.getPeriodTo()); } catch{ errors.reject("Incorrect format"); } ...... 但是,如果我需要针对几个可

我现在就是这样做的:

......

DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
try{
    dateFormat.parse(criteria.getPeriodFrom());
    dateFormat.parse(criteria.getPeriodTo());
}
catch{
    errors.reject("Incorrect format");
}

......
但是,如果我需要针对几个可接受的模式(例如“dd.MM.yyyy”、“ddMMyyyy”…)进行验证,该怎么办呢。我不想对DateFormats的集合进行任何复制粘贴或迭代:)有没有很酷的库呢?

只需将循环放在try/catch块之外:

boolean success = false;
for (DateFormat candidate : formats) {
    try {
        candidate.parse(criteria.getPeriodFrom());
        candidate.parse(criteria.getPeriodTo());
        success = true;
        break;
    }
    catch (ParseException e) {
        // Expected... move on
    }
}
if (!success) {
    errors.reject("Incorrect format");
}
不幸的是,Java内置库和通常优秀的库都没有类似.NET的
DateTime.TryParseExact
的东西,它可以让您测试解析操作是否工作,没有一个丑陋的例外:(请注意,至少Joda Time的格式化程序是线程安全和不可变的

编辑:我可能错了…显然,失败时返回null,所以您可以使用:

for (DateFormat candidate : formats) {
    if (isValid(candidate, criteria)) {
        // whatever
    }
}

...
private static boolean isValid(DateFormat format, Criteria criteria) {
    return format.parse(criteria.getPeriodFrom(), new ParsePosition(0)) != null &&
           format.parse(criteria.getPeriodTo(), new ParsePosition(0)) != null))
}

我不知道这是否会有帮助,但是在这里查看JodaTime,这是我见过的使用普通Java库完成它的唯一方法。仅供参考,您的for语句应该是
for(DateFormat DateFormat:formats){…}
@JavaDrinker:查看我的编辑-我认为有一种更好的方法…查看我的编辑。@JonSkeet您使用了
DateFormat候选者
,然后用
DateFormat
调用了您的函数。@Mike:Whoops,谢谢-我在第一段代码中修复了它,但第二段代码没有。。。