【问题标题】:Using Datetime with format dd.MM.yyyy parses strings with only two digit year?使用格式为 dd.MM.yyyy 的 Datetime 解析只有两位数年份的字符串?
【发布时间】:2018-09-20 10:37:46
【问题描述】:

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

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

【问题讨论】:

  • 范围检查?您知道您将接受的日期范围,并且由于它不会追溯到 18 年,因此请拒绝任何日期。

标签: java datetime jodatime


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2022-08-09
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多