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,谢谢-我在第一段代码中修复了它,但第二段代码没有。。。