使用yyyy/mm/dd simpledateformat可以将非日期字符串传递到日期

ttcibm8c  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(396)

这个问题在这里已经有答案了

简单的形式宽大会导致意外行为(3个答案)
当str=2011/12/12aaaaaaaaaaa时,simpledateformat parse(string str)不会引发异常(7个答案)
16天前关门了。
我使用这个simpledateformat yyyy/mm/dd将日期值从字符串传递到日期。但有一个问题:当我输入一个非日期值时,比如2020/12/2x,它将返回到2020/12/02。当我尝试2020/12/x2时,函数将返回一个错误。有人知道为什么会这样吗?非常感谢。这是我的密码。
声明SimpleDataFormat

SimpleDateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
    df2.setLenient(false);

用于检查输入的字符串是否为有效日期的函数

private static Boolean validDate(DateFormat df, String s) {
    Boolean valid=false;
    try {
        Date d= df.parse(s);
        valid=true;
    } catch (Exception e) {
         valid=false;
    }
    return valid;
}

我使用了输入:
2020年12月2日

332nm8kg

332nm8kg1#

我认为 parse(string) 方法只是从索引0移动到尽可能远的索引,在那里它可以将源字符串解析到正确的日期,而不关心剩余的字符。它造成了
df2.parse(“2020/12/2x”)
相当于
df2.parse(“2020/12/2x\u此处显示任何内容”)
万一 df2.parse("2020/12/x2") . 当方法传播到 x 字符,它意识到没有满足“2020/12/x”的日期,所以它立即抛出一个异常。

5vf7fwbs

5vf7fwbs2#

这个 SimpleDateFormat 类包含许多具有意外行为的角落案例(如在注解中指出的) DateFormat.parse(String) javadoc表示,该方法可能不会使用给定字符串的整个文本),并且长期以来一直不赞成使用 java.time 包裹。例如,

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate d = LocalDate.parse("2020/12/2x", formatter);
System.out.println(formatter.format(d));

是一致的,抛出 java.time.format.DateTimeParseException: Text '2020/12/2x' could not be parsed at index 8

相关问题