Is this a Java DateFormat bug?
The pattern is "dd-MM-yyyy"
I think the string "01-01-2010mwwwwwwwwwwwwwww" does not satisfy the pattern, but the following code shows the contrary.
Anyone can explain why?
publ开发者_如何学编程ic 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);
}
Thanks
The parse method does not try to match the entire input string. That is, the prefix 01-01-2010
matches, and that's enough.
From DateFormat.parse
:
Parses text from the beginning of the given string to produce a date. The method may not use the entire text of the given string.
If you need to figure out if it was a "complete match", you could try the following:
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()));
This prints
Complete match: false
Complete match: true
It's because the default lenient parameter for DateFormat is true. This means the parser will parse input string even though it's in incorrect format. Which will (sometime) lead to incorrect result.
On the other hand, we can force the parser to be strict to given pattern. This means an incorrect input string will throw an exception.
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);
}
精彩评论