4

模式是“dd-MM-yyyy”

我认为字符串“01-01-2010mwwwwwwwwwwwwwww”不满足模式,但以下代码显示相反。

任何人都可以解释为什么?

public static void main(String[] args) throws Exception {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

    Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww");

    System.out.println(date);
}

谢谢

4

2 回答 2

16

parse 方法不会尝试匹配整个输入字符串。也就是说,前缀01-01-2010匹配,这就足够了。

来自DateFormat.parse

从给定字符串的开头解析文本以生成日期。该方法可能不会使用给定字符串的整个文本。


如果您需要确定它是否是“完全匹配”,您可以尝试以下操作:

SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

String strDate = "01-01-2010mwwwwwwwwwwwwwww";
ParsePosition pp = new ParsePosition(0);
Date date = df.parse(strDate, pp);
System.out.println("Complete match: " + (pp.getIndex() == strDate.length()));

strDate = "01-01-2010";
pp = new ParsePosition(0);
date = df.parse(strDate, pp);
System.out.println("Complete match: " + (pp.getIndex() == strDate.length()));

这打印

Complete match: false
Complete match: true
于 2010-06-11T20:24:05.253 回答
0

这是因为 DateFormat 的默认 lenient 参数为 true。这意味着解析器将解析输入字符串,即使它的格式不正确。这将(有时)导致不正确的结果。

另一方面,我们可以强制解析器严格遵守给定的模式。这意味着不正确的输入字符串将引发异常。

public static void main(String[] args) throws Exception {
  SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
  df.setLenient(false); // Switch to strict mode
  Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww"); // This will throw an exception
  System.out.println(date);
}
于 2010-08-26T05:16:25.623 回答