开发者

Is this a Java DateFormat bug?

开发者 https://www.devze.com 2023-01-03 00:16 出处:网络
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.

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);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消