使用格式为 dd.MM.yyyy 的日期时间解析只有两位数年份的字符串?

Using Datetime with format dd.MM.yyyy parses strings with only two digit year?

我需要验证字符串是否包含有效的日期输入。为此,我创建了一个方法

public static Date validateDateFormat(final String expectedDateFormat, final String dateToValdate) {


    DateTimeFormatter formatter = DateTimeFormat.forPattern(expectedDateFormat);
    DateTime dt = null;

    try {
        dt = formatter.parseDateTime(dateToValdate);
    } catch (Exception e) {
        log.error("cannot parse {0} to format {1}", dateToValdate, expectedDateFormat);
    }
    if (dt != null) {
        return dt.toDate();
    }
    else {
        return null;
    }       
}

有了这些值,它不会像预期的那样 return null。该字符串将转换为值为 0018-12-18T00:00:00.000+00:53:28 的 DateTime,有没有办法改变这种行为?我虽然如果格式不正确,它会失败。

这是我的测试

@Test
public void checkFormat6() {
    String date = "18.12.18";
    String expectedFormat = "dd.MM.yyyy";       

    assertNull(DateFormatChecker.validateDateFormat(expectedFormat, date));
}

我需要使用 JDK 7 并使用 joda-time 2.10

Joda Time 与 yyyyyyy 不严格匹配。即使 d.M.y 模式也会将 18.12.18 解析为有效的日期时间。

您可以使用 java.time 类 获得更严格的模式解析(Java 7 有一个反向移植)例如通过设置 ResolverStyle.STRICT:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(expectedFormat)
    .withResolverStyle(ResolverStyle.STRICT);

上面的例子会失败 dd.MM.yyyy 但它仍然会让 d.M.y 解析 18.12.18.