当最后一个字符是非数字时,SimpleDateFormat无法引发异常

时间:2011-11-08 22:44:12

标签: java date format

为什么这段代码不会引发'ParseException'?

DateFormat formatter = new SimpleDateFormat("dd/mm/yyyy");
try {
     String date = "01/01/200'";
     formatter.parse(date);
} catch (ParseException ex) {
     throw new ParseException("Formato de fecha inválido",0);
}

请向我解释一下,我迷失了。请注意简单引用'

3 个答案:

答案 0 :(得分:4)

因为这是应该做的。 如果您检查docs on DateFormat它所说的参数。

source - A String whose beginning should be parsed.

如果要限制格式,则必须使用正则表达式。

另请查看SimpleDateformat关于年份的规则:

For parsing, if the number of pattern letters is more than 2, the year is interpreted literally, regardless of the number of digits. So using the pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D.

答案 1 :(得分:3)

根据Javadocs SimpleDateFormat

  

对于解析,如果模式字母的数量大于2,则无论数字位数如何,都按字面解释年份。所以使用模式“MM / dd / yyyy”,“01/11/12”解析到12月1日,12 A.D。

所以我怀疑这一年解析为200 A.D。

我刚刚运行了你的程序,这就是正在发生的事情。转换后的Date是:

Date = Tue Jan 01 00:01:00 EST 200

答案 2 :(得分:0)

parse方法将忽略解析日期末的任何非数字字符。

例如,如果解析"01/01/01asdsdf0'",它将只关注"01/01/01"并忽略文本......所以年份将为01。

但是如果您尝试解析"01/01/asdsdf0'"将引发异常,因为没有数字年份。