I'm using the code included here to determine whether given values are valid dates. Under one specific case, it's evaluating the following street address:
100 112TH AVE NE
Obviously not a date, but Java interprets it as:
Sun Jan 12 00:00:00 EST 100
The code in question:
String DATE_FORMAT = "yyyyMMdd";
try {
DateFormat dfyyyyMMdd = new SimpleDateFormat(DATE_FORMAT);
dfyyyyMMdd.setLenient(false);
Date formattedDate;
formattedDate = dfyyyyMMdd.parse(aValue);
console.debug(String.format("%s = %s","formattedDate",formattedDate));
} catch (ParseException e) {
// Not a date
}
The console returns:
11:41:40.063 DEBUG TestValues | formattedDate = Sun Jan 12 00:00:00 EST 100
Any idea what's going on here?
The parse
method does not verify that the entire string was consumed when parsing; you can have random garbage after a valid date and everything works. In this case, it's a little surprising that 100 112
can be successfully parsed as a date, but it can.
You can supply a ParsePosition
to verify that the entire string was consumed when parsing.
ParsePosition pos = new ParsePosition(0);
dfyyyyMMdd.parse(aValue, pos);
if (pos.getIndex() != aValue.length()) {
// there's garbage at the end
}
As per the documentation, the parse method may NOT use the entire text of the string -
public Date parse(String source)
throws ParseException
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.
I checked the source code for SimpleDateFormat and found that it is parsing the string only up to the length of the compiledPattern
.
Thus, the strings of the form -
yyyyMMdd(followed by anything)
will be parsed without any errors.
So, for e.g. it also parses -
"10000514blabla" --> Tue May 14 00:00:00 EST 1000
"100 112" --> Sun Jan 12 00:00:00 EST 100
"1 112xyz" --> Wed Jan 12 00:00:00 EST 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With