Java 日期格式 : most convenient & elegant way to validate input date against multiple patterns

标签 java

我现在就是这样做的:

......

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 block 之外:

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 内置库,也不是通常优秀的 Joda Time有类似 .NET 的 DateTime.TryParseExact 的东西,它可以让你测试解析操作是否有效,没有丑陋的异常:( 请注意,至少 Joda Time 的格式化程序是线程安全的并且不可变。

编辑:我可能错了……显然 DateFormat.parse(String, ParsePosition)仅在失败时返回 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))
}

关于Java 日期格式 : most convenient & elegant way to validate input date against multiple patterns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7756041/

相关文章:

java - 多个 RandomAccessFile 对象可以将数据写入同一个文件吗?

java - 是否可以在 Spring 启动时将Web套接字与rest api一起使用?

java - Maven 和 Java 的 ClassNotFoundException

java - Wildfly 聚类不适用于 web-fragment.xml

java - CURSOR 和 REF CURSOR 作为 JDBC 数据类型

java - 有没有办法使用java打开 "Windows Mobility Center"?

java - 如何处理来自 AsyncTask 的返回值

java - 在 Intellij 中打开 Nullable 警告

java - 如果函数多次附加加载消息

java - Eclipselink Mysql 表名大写