Meaningless Drivel is fun!*
The moose likes Java in General and the fly likes SimpleDateFormat parses illegal date string Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Murach's Java Servlets and JSP this week in the Servlets forum!
JavaRanch » Java Forums » Java » Java in General
Bookmark "SimpleDateFormat parses illegal date string" Watch "SimpleDateFormat parses illegal date string" New topic
Author

SimpleDateFormat parses illegal date string

Sebastian Janisch
Ranch Hand

Joined: Feb 23, 2009
Posts: 1183
Hey guys,

I am having a SimpleDateFormat instance and passing an illegal date string to it's parse method, expecting an exception.

For some reason however, the pasing goes thru. The Date object is stale though.

Here is the code



Thanks

edit: is there any other way to check whether or not a date string conforms to a given format except for working with exceptions?


JDBCSupport - An easy to use, light-weight JDBC framework -
Christophe Verré
Sheriff

Joined: Nov 24, 2005
Posts: 14687
    
  16

I'm not even thinking why it goes through but if you use format.setLenient(false);, you should get a ParseException.


[My Blog]
All roads lead to JavaRanch
Rob Spoor
Sheriff

Joined: Oct 27, 2005
Posts: 19651
    
  18

Call setLenient(false). By default, most DateFormat implementations are lenient. That means that they allow things like February 30th, or even a thirteenth month. It will just wrap these around - February 30th is March 2nd (or 1st in leap years), the thirteenth month will be January of the next year.
In your case it will use 2010 as the number of days in September 2017 (or 17, don't really know). It will overflow quite a few years I reckon

By turning leniency off you are prohibiting this behaviour. February 30th, a thirteenth month, or September 2010th 2017 will all cause errors.


SCJP 1.4 - SCJP 6 - SCWCD 5 - OCEEJBD 6
How To Ask Questions How To Answer Questions
Sebastian Janisch
Ranch Hand

Joined: Feb 23, 2009
Posts: 1183
Awesome, it worked.

Any idea as to how to check for the validity of a date string other than working with exceptions like this:

Christophe Verré
Sheriff

Joined: Nov 24, 2005
Posts: 14687
    
  16

I think that dealing with the exception is the easiest way. The API already parses the string for you, why would you do it on your side too ?
Sebastian Janisch
Ranch Hand

Joined: Feb 23, 2009
Posts: 1183
Christophe Verré wrote:I think that dealing with the exception is the easiest way. The API already parses the string for you, why would you do it on your side too ?


I was looking for a method like 'isValidFormat' so I don't have to go thru the exceptions dealing.
Christophe Verré
Sheriff

Joined: Nov 24, 2005
Posts: 14687
    
  16

There's one :

but not in DateFormat
Rob Spoor
Sheriff

Joined: Oct 27, 2005
Posts: 19651
    
  18

Ah, more people to tell about the other parse method!
DateFormat.parse(String) uses DateFormat.parse(String, ParsePosition) internally, and throws an exception if parsing fails:

As for the two returns from my code. The first return statement is the basic form; it will only check if the date String starts with a valid date. If the pattern is yyyy-MM-dd then it will consider 2010-09-17abc as valid. The second form also checks if the parsing consumes all of the String. With the given example, date.length() is 13 whereas parsing stops at 10. Since 10 != 13 it will return false.

This non-strict parsing allows you to combine multiple formatters with one string. The ParsePosition gets updated, so a next Format would start at position 10, ignoring the preceding text.
David Newton
Author
Rancher

Joined: Sep 29, 2008
Posts: 12617

Oh, hmm; interesting.
 
jQuery in Action, 2nd edition
 
subject: SimpleDateFormat parses illegal date string
 
Similar Threads
how to convert date to a string
Date Parsing Issue...
How to get month name
String to date format
Retrieving date field from oracle