使用格式为dd.MM.yyyy的Datetime可以解析只有两位数字年份的字符串?

时间:2018-09-20 10:37:47

标签: java datetime jodatime

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

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;
    }       
}

使用这些值,它不会按预期返回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

1 个答案:

答案 0 :(得分:4)

Joda时间与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