Welcome to this week’s installment of .NET Tips & Techniques! Each week, award-winning Architect and Lead Programmer Tom Archer from the Archer Consulting Group demonstrates how to perform a practical .NET programming task.
Most times the easiest means of validating a user-entered date is by providing a masked edit control that forces the user to enter valid numbers into the month/day/year parts of the field. However, a system you maintain many times won’t have a masked edit. It instead allows the user to enter the date value in a “free form” edit control, which necessitates a manual validation of the entered date.
One obvious way to address this problem is to check each set of digits (representing the day, month, and year) similar to the following:
static bool ManuallyValidate(String date) { // check month in mmddyy or mmddyyyy format if (Convert.ToInt32(date.Substring(0, 2)) <= 12 && Convert.ToInt32(date.Substring(0, 2)) >= 1) ... // Continue checking other digits return true; else return false; }
However, one obvious shortcoming of this approach is that it works with only one date format—unless you include a format parameter and a lot of conditional code for each date format type. A much more robust and easy way to deal with this problem is to use the types provided via the .NET Globalization namespace. Here’s an example of using the DateTimeFormatInfo and DateTime types to validate your dates in three lines of code:
static bool ValidateDate(String date, String format) { try { System.Globalization.DateTimeFormatInfo dtfi = new System.Globalization.DateTimeFormatInfo(); dtfi.ShortDatePattern = format; DateTime dt = DateTime.ParseExact(date, "d", dtfi); } catch(Exception) { return false; } return true; }
As you can see, the ValidateDate method takes a String that represents the date to be validated and a String that represents the format to be checked, such as yymm or MMdd. The client would then call this function as follows:
BOOL success; success = ValidateDate("3403", "MMmm"); // false as 34 is not a valid month success = ValidateDate("3403", "yymm"); // true success = ValidateDate("1212", "MMdd"); // true
Obviously, you could extend this example further, but this article should serve as a good introduction to some of what the Globalization namespace can do and how easy it is to use. For a list of the various patterns that you can use, simply look up the topic DateTimeFormatInfo in on-line help, as well as the ShortDatePattern vs. LongDatePattern topic.
Download the Code
To download the accompanying source code for this tip, click here.
About the Author
The founder of the Archer Consulting Group (ACG), Tom Archer has been the project lead on three award-winning applications and is a best-selling author of 10 programming books as well as countless magazine and online articles.