MENU

判断字符串是否为指定日期格式

March 17, 2019 • Read: 558 • Java

在做单表动态增删改查功能时产生了这样一个需求,判断传入的字符串是否符合指定数据库插入的格式要求;很简单的一个问题,但是没找到直接可用的判断方法。首先想到的是用SimpleDateFormat来parse字符串,如果抛出异常则为不符合,反之则符合,代码如下:

private static boolean isValidFormat(String format, String value) {
    boolean ok = true;
    DateFormat df = new SimpleDateFormat(format);
    try {
        df.parse(value);
    } catch (ParseException e) {
        ok = false;
    }
    return ok;
}

使用yyyy-MM-dd HH:mm:ss格式和2019-02-31 13:12:20进行测试,

@Test
public void test_1() {
    String format = "yyyy-MM-dd HH:mm:ss";
    String value = "2019-02-31 13:12:20";
    Assert.assertFalse(isValidFormat(format, value));
}

显然,测试没有通过;02月31也被当作了正确的日期;在

public abstract Date parse(String source, ParsePosition pos);

注释中写道:

By default, parsing is lenient: If the input is not in the form used by this object's format method but can still be parsed as a date, then the parse succeeds. Clients may insist on strict adherence to the format by calling {@link #setLenient(boolean) setLenient(false)}.

默认情况下解析是宽松的,比如2018-13-01也会被解析为值为2019-01-01的日期。将宽松模式设置为false, 再次执行则通过。

执行test_2,测试还是失败,虽然设置了严格模式,2019-02-18 13:12:2还是被当成了符合条件的字符串:

@Test
public void test_2() {
    String format = "yyyy-MM-dd HH:mm:ss";
    String value = "2019-02-18 13:12:2";
    Assert.assertFalse(isValidFormat(format, value));
}