Java正则表达式匹配一个时间格式的字符串

Java 2019-12-06 阅读 228 评论 0

在使用 java 处理前端传过来的表单数据时,经常需要验证时间的格式是否有效。验证时间格式的难点在于每个月份与当月对应的天数有多种情况。比如1月份31天,但是2月份有可能是28或者29天。

验证每个月的最大天数如下:

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

以下以这样的时间格式(2018-01-3 08:02:02或者2018-1-03 08:2:2)为例,使用Java正则表达式匹配一个时间格式的字符串

/**
 * 验证时间字符串格式输入是否正确
 * @param timeStr
 * @return
 */
private boolean valiDateTimeWithLongFormat(String timeStr) {
    String format = "((19|20)[0-9]{2})-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) "
            + "([01]?[0-9]|2[0-3]):[0-5]?[0-9]:[0-5]?[0-9]";
    Pattern pattern = Pattern.compile(format);
    Matcher matcher = pattern.matcher(timeStr);
    if (matcher.matches()) {
        pattern = Pattern.compile("(\\d{4})-(\\d+)-(\\d+).*");
        matcher = pattern.matcher(timeStr);
        if (matcher.matches()) {
            int y = Integer.valueOf(matcher.group(1));
            int m = Integer.valueOf(matcher.group(2));
            int d = Integer.valueOf(matcher.group(3));
            if (d > 28) {
                Calendar c = Calendar.getInstance();
                c.set(y, m-1, 1);
                int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
                return (lastDay >= d);
            }
        }
        return true;
    }
    return false;
}

调用示例

this.valiDateTimeWithLongFormat("2018-02-28 12:0:2");    // true
this.valiDateTimeWithLongFormat("2018-2-29 02:00:20");    // false
this.valiDateTimeWithLongFormat("2018/02/2 12:0:2");    // false

亲自试一试:Demo

最后更新 2019-12-09