Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: Java
Expertise: Intermediate
Jun 22, 1999

Prevent Lenient Date Parsing

The java.text.DateFormat class and its java.util.SimpleDateFormat subclass are useful for formatting and parsing date and time values. For example, your application may allow a user to enter a date value and then use SimpleDateFormat to process it and return an instance of java.util.Date. When DateFormat attempts to process a string representation of a date using the parse() method, it normally throws an exception if the string does not represent a valid date. However, there are some cases where DateFormat will not throw an exception when parse() is passed an invalid date. For example:

 
import java.util.*;
import java.text.*;

public class BadDate {
	public static void main(String[] args)
throws Exception {
		SimpleDateFormat sdf =
new SimpleDateFormat("MM/dd/yyyy");
		Date d = sdf.parse("02/09/hello");
		System.out.println("Converted to " + d);
	}  // public static void main()
}  //  public class BadDate

Since this code attempts to parse a string with an invalid year ("hello"), you might expect it to throw an exception. In fact, it does not, and generates output similar to:

 
Converted to Mon Feb 09 00:00:00 CST 0001

Note that what should have been the year portion of the date string ("hello") was incorrectly translated to a value of 0001. So although parse() was passed an invalid date, it failed to throw an exception. However, there is an explanation for this behavior and a simple remedy for it.

By default, DateFormat instances use a "lenient" mode when parsing dates, and in some cases will try to "guess" what was intended when the date string is invalid. You can disable this feature by calling the DateFormat's setLenient() method. For example, to successfully detect the invalid date in the sample code, insert this line prior to the call to the parse() method:

 
sdf.setLenient(false);

This disables lenient mode for the DateFormat instance, and will cause a ParseException to be thrown instead of incorrectly parsing the invalid date. You can use this approach to ensure that your code always detects invalid date strings.

Brett Spell
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date