这个问题在这里已经有答案了:
简单的形式宽大会导致意外行为(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日
2条答案
按热度按时间332nm8kg1#
我认为
parse(string)
方法只是从索引0移动到尽可能远的索引,在那里它可以将源字符串解析到正确的日期,而不关心剩余的字符。它造成了df2.parse(“2020/12/2x”)
相当于
df2.parse(“2020/12/2x\u此处显示任何内容”)
万一
df2.parse("2020/12/x2")
. 当方法传播到x
字符,它意识到没有满足“2020/12/x”的日期,所以它立即抛出一个异常。5vf7fwbs2#
这个
SimpleDateFormat
类包含许多具有意外行为的角落案例(如在注解中指出的)DateFormat.parse(String)
javadoc表示,该方法可能不会使用给定字符串的整个文本),并且长期以来一直不赞成使用java.time
包裹。例如,是一致的,抛出
java.time.format.DateTimeParseException: Text '2020/12/2x' could not be parsed at index 8