• (2 Pages)
  • +
  • 1
  • 2

Date Validation using SimpleDateFormat() Rate Topic: ***** 1 Votes

#1 fyrestorm  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 10
  • View blog
  • Posts: 3,113
  • Joined: 04-April 02

Posted 24 February 2006 - 11:16 AM

*
POPULAR

I was told that the JDK class SimpleDateFormat() might be useful for me to use in validating dates for a program that I'm working on.

Unfortunately for me, the documentation was crummy and it took a while to figure out what I needed to do. Fortunately for all that are reading this, after many hours of pain on my end, I can now write a tutorial for all the world to see.

This is very elementary in that it will only check to see if the date supplied is in the proper fomat that meets your specifications and it will check to see if the date is a proper date, meaning that someone can't try to enter a date such as 02/30/06.

In the future, I may add more robustness to this tutorial, but as it stands, this is all that I needed for my current assignment and I know that there are a number of other students stuggling with this so I thought it would be beneficial to post this tutorial as it is.

// date validation using SimpleDateFormat
// it will take a string and make sure it's in the proper 
// format as defined by you, and it will also make sure that
// it's a legal date

public boolean isValidDate(String date)
{
    // set date format, this can be changed to whatever format
    // you want, MM-dd-yyyy, MM.dd.yyyy, dd.MM.yyyy etc.
    // you can read more about it here:
    // http://java.sun.com/j2se/1.4.2/docs/api/index.html
    
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    
    // declare and initialize testDate variable, this is what will hold
    // our converted string
    
    Date testDate = null;

    // we will now try to parse the string into date form
    try
    {
      testDate = sdf.parse(date);
    }

    // if the format of the string provided doesn't match the format we 
    // declared in SimpleDateFormat() we will get an exception

    catch (ParseException e)
    {
      errorMessage = "the date you provided is in an invalid date" +
                              " format.";
      return false;
    }

    // dateformat.parse will accept any date as long as it's in the format
    // you defined, it simply rolls dates over, for example, december 32 
    // becomes jan 1 and december 0 becomes november 30
    // This statement will make sure that once the string 
    // has been checked for proper formatting that the date is still the 
    // date that was entered, if it's not, we assume that the date is invalid

    if (!sdf.format(testDate).equals(date)) 
    {
      errorMessage = "The date that you provided is invalid.";
      return false;
    }
    
    // if we make it to here without getting an error it is assumed that
    // the date was a valid one and that it's in the proper format

    return true;

} // end isValidDate



Is This A Good Question/Topic? 5
  • +

Replies To: Date Validation using SimpleDateFormat()

#2 eLliDKraM  Icon User is offline

  • Pepè Le Pewn
  • member icon

Reputation: 6
  • View blog
  • Posts: 6,565
  • Joined: 13-August 05

Posted 01 March 2006 - 07:50 PM

It's short and it gets to the point. Even my dumbass understood it, good tutorial.
Was This Post Helpful? 2
  • +
  • -

#3 symbol  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 10
  • Joined: 09-March 06

Posted 09 March 2006 - 05:11 PM

Hi, well done for writing the code! i am in a similiar situation to you, i am trying to validate a date (birthday) field which gets input into a mysql database.

the only problem i am having is how do you implement the code to work with the date field?

i have copied the code and inserted it into my code, changed the date format to yyyy-MM-dd as that is how i am doing it.

simply, how do i get it to work? :(

i am getting the date from a text field:

<input type="text" value="1900-01-01" name="birthday"  size=20>


Was This Post Helpful? 0
  • +
  • -

#4 fyrestorm  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 10
  • View blog
  • Posts: 3,113
  • Joined: 04-April 02

Posted 10 March 2006 - 08:42 AM

you need to call the function when you want to validate it, let's say when the user pushes the submit button (i'm assuming that you're using a form)

if(!isValidDate(birthday))
{
//do something here
}



additionally, since it looks like you're using a form, i'd suggest using a select option for the month, and day and year, because you can then bypass the validation because theoretically they should all be acceptable values as defined by the select box...
Was This Post Helpful? 0
  • +
  • -

#5 ralph.bean  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 1
  • Joined: 30-March 06

Posted 30 March 2006 - 02:56 PM

While validation on the backend is critical, I was working on the same problem today and found this to be most helpful.
Was This Post Helpful? 0
  • +
  • -

#6 Hasenpfote  Icon User is offline

  • New D.I.C Head

Reputation: 1
  • View blog
  • Posts: 1
  • Joined: 05-April 06

Posted 05 April 2006 - 08:25 AM

Another way would be the usage of a non-lenient calendar:

GregorianCalendar cal = new GregorianCalendar();
cal.setLenient(false);
cal.set(Calendar.YEAR, getBirthYear());
cal.set(Calendar.MONTH, getBirthMonth());
cal.set(Calendar.DAY_OF_MONTH, getBirthDay());

try {
   //This is important!!!! Look at javadoc of calendar
   cal.getTimeInMillis();
} catch (Exception e) {
//will be thrown, if the date is not valid
//handle error
}




I think this is easier if you have your date build from mulitple fields.
Was This Post Helpful? 1
  • +
  • -

#7 razom  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 10
  • Joined: 30-April 06

Posted 01 May 2006 - 12:08 AM

how to make it easier to understand ?
Was This Post Helpful? 0
  • +
  • -

#8 hemanthjava  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 6
  • Joined: 01-July 06

Posted 01 July 2006 - 12:08 PM

Here is a nice DATE UTILITY, I found in http://www.freejavaguide.com which does many many things other then Date Validation.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtility {
	
/* Add Day/Month/Year to a Date
add() is used to add  values to a Calendar object. 
You specify which Calendar field is to be affected by the operation 
(Calendar.YEAR, Calendar.MONTH, Calendar.DATE). 
*/
	public static void addToDate(){
		System.out.println("In the ADD Operation");
	//	String DATE_FORMAT = "yyyy-MM-dd";
		String DATE_FORMAT = "dd-MM-yyyy";		//Refer Java DOCS for formats
		java.text.SimpleDateFormat sdf =  new java.text.SimpleDateFormat(DATE_FORMAT);
		Calendar c1 = Calendar.getInstance();
		Date d1 = new Date();
		System.out.println("Todays date in Calendar Format : "+c1);
		System.out.println("c1.getTime() : "+c1.getTime());
		System.out.println("c1.get(Calendar.YEAR): " + c1.get(Calendar.YEAR));
		System.out.println("Todays date in Date Format : "+d1);
		c1.set(1999,0 ,20); 		//(year,month,date)
		System.out.println("c1.set(1999,0 ,20) : "+c1.getTime());
		c1.add(Calendar.DATE,40);
		System.out.println("Date + 20 days is : " + sdf.format(c1.getTime()));
		System.out.println();
		System.out.println();
	}
	
	
/*Substract Day/Month/Year to a Date
	roll() is used to substract values to a Calendar object. 
	You specify which Calendar field is to be affected by the operation 
	(Calendar.YEAR, Calendar.MONTH, Calendar.DATE). 
	
	Note: To substract, simply use a negative argument. 
	roll() does the same thing except you specify if you want to roll up (add 1) 
	or roll down (substract 1) to the specified Calendar field. The operation only
	affects the specified field while add() adjusts other Calendar fields. 
	See the following example, roll() makes january rolls to december in the same 
	year while add() substract the YEAR field for the correct result

*/
	
	public static void subToDate(){
		System.out.println("In the SUB Operation");
		String DATE_FORMAT = "dd-MM-yyyy";
		java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(DATE_FORMAT);
		Calendar c1 = Calendar.getInstance(); 
		c1.set(1999, 0 , 20); 
		System.out.println("Date is : " + sdf.format(c1.getTime()));
		
		// roll down, substract 1 month
		c1.roll(Calendar.MONTH, false); 
		System.out.println("Date roll down 1 month : " + sdf.format(c1.getTime())); 

		c1.set(1999, 0 , 20); 
		System.out.println("Date is : " + sdf.format(c1.getTime()));
		c1.add(Calendar.MONTH, -1); 
		// substract 1 month
		System.out.println("Date minus 1 month : " + sdf.format(c1.getTime())); 
		System.out.println();
		System.out.println();
	}
	
	public static void daysBetween2Dates(){
		Calendar c1 = Calendar.getInstance(); 	//new GregorianCalendar();
		Calendar c2 = Calendar.getInstance(); 	//new GregorianCalendar();
		c1.set(1999, 0 , 20); 
		c2.set(1999, 0 , 22); 
		System.out.println("Days Between "+c1.getTime()+"\t"+ c2.getTime()+" is");
		System.out.println((c2.getTime().getTime() - c1.getTime().getTime())/(24*3600*1000));
		System.out.println();
		System.out.println();
	}
	
	public static void daysInMonth() {
		Calendar c1 = Calendar.getInstance(); 	//new GregorianCalendar();
		c1.set(1999, 6 , 20); 
		int year = c1.get(Calendar.YEAR);
		int month = c1.get(Calendar.MONTH);
//		int days = c1.get(Calendar.DATE);
		int [] daysInMonths = {31,28,31,30,31,30,31,31,30,31,30,31};
		daysInMonths[1] += DateUtility.isLeapYear(year) ? 1 : 0;
		System.out.println("Days in "+month+"th month for year "+year+" is "+ daysInMonths[c1.get(Calendar.MONTH)]);
		System.out.println();
		System.out.println();
	}
	
	public static void getDayofTheDate() {
		Date d1 = new Date();
		String day = null;
		DateFormat f = new SimpleDateFormat("EEEE");
		try {
		 day = f.format(d1);
		}
		catch(Exception e) {
		  e.printStackTrace();
		}
		System.out.println("The dat for "+d1+" is "+day);
		System.out.println();
		System.out.println();
	}
	
	public static void validateAGivenDate() {
		String dt = "20011223";   
		String invalidDt = "20031315";
		String dateformat = "yyyyMMdd";   
		Date dt1=null , dt2=null;
		try {	 
			SimpleDateFormat sdf = new SimpleDateFormat(dateformat);	
			sdf.setLenient(false);	
			dt1 = sdf.parse(dt);  
			dt2 = sdf.parse(invalidDt);   
			System.out.println("Date is ok = " + dt1 + "(" + dt + ")");	 
		}  
		catch (ParseException e) {	 
			System.out.println(e.getMessage()); 
		}  
		catch (IllegalArgumentException e) {	
			System.out.println("Invalid date");	 
		}
		System.out.println();
		System.out.println();
	}
	
	public static void compare2Dates(){
		SimpleDateFormat fm = new SimpleDateFormat("dd-MM-yyyy");
		Calendar c1 = Calendar.getInstance();
		Calendar c2 = Calendar.getInstance();
		
		c1.set(2000, 02, 15);
		c2.set(2001, 02, 15);
		
		System.out.print(fm.format(c1.getTime())+" is ");
		if(c1.before(c2)){
			System.out.println("less than "+c2.getTime());
		}else if(c1.after(c2)){
			System.out.println("greater than "+c2.getTime());
		}else if(c1.equals(c2)){
			System.out.println("is equal to "+fm.format(c2.getTime()));
		}
		System.out.println();
		System.out.println();
	}

	public static boolean isLeapYear(int year){
		 if((year%100 != 0) || (year%400 == 0)){
			 return true;
		 }
		 return false;
	}

	public static void main(String args[]){
		addToDate();
		subToDate();
		daysBetween2Dates();	//The "right" way would be to compute the julian day number of both dates and then do the substraction.
		daysInMonth();
		validateAGivenDate();
		compare2Dates();
		getDayofTheDate();
	}
	
}



For More code simply check http://www.freejavaguide.com
Was This Post Helpful? 0
  • +
  • -

#9 oubless  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 24
  • Joined: 28-May 07

Posted 28 November 2008 - 01:54 AM

View Postfyrestorm, on 10 Mar, 2006 - 07:42 AM, said:

you need to call the function when you want to validate it, let's say when the user pushes the submit button (i'm assuming that you're using a form)

if(!isValidDate(birthday))
{
//do something here
}



additionally, since it looks like you're using a form, i'd suggest using a select option for the month, and day and year, because you can then bypass the validation because theoretically they should all be acceptable values as defined by the select box...

NEVER EVER TRUST A USER INPUT!!! EVER!!!
There is nothing more simple than sending different input. About dates - I would suggest to use a javascript calendar/datepicker unless javascript is forbidden. I would recommend jQuery UI Datepicker. You need to write a method to translate your Java date format string to its date format string, but its worth the work.
Was This Post Helpful? 0
  • +
  • -

#10 Guest_Brendan*


Reputation:

Posted 08 March 2010 - 10:01 AM

There's an unexpected behaviour. Try this.

<code>
try {
new SimpleDateFormat("yyyy/MM/dd").parse("20/1003/02");
System.out.println("correct");
} catch (ParseException e) {
System.out.println("wrong");
}
</code>
Was This Post Helpful? 0

#11 Guest_balu*


Reputation:

Posted 09 April 2010 - 11:56 AM

This function is what exactly I am looking for. Thank you so much
Was This Post Helpful? 0

#12 Guest_Snaduko*


Reputation:

Posted 04 May 2010 - 03:41 PM

Thanks for sharing your code, i was just looking for a way to make it quicker and you gave an awesome way. thanks
Was This Post Helpful? 0

#13 Guest_Drakanor*


Reputation:

Posted 04 June 2010 - 07:32 AM

Just do

sdf.setLenient(false);



and you can drop the last if clause.
Was This Post Helpful? 0

#14 embs  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 1
  • Joined: 29-November 10

Posted 29 November 2010 - 03:18 PM

Yes! That's really helpfull. Thanks for sharing knowledge.
Was This Post Helpful? 0
  • +
  • -

#15 TomR  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 2
  • Joined: 06-July 11

Posted 06 July 2011 - 12:11 PM

View Postfyrestorm, on 24 February 2006 - 11:16 AM, said:

I was told that the JDK class SimpleDateFormat() might be useful for me to use in validating dates for a program that I'm working on.

Unfortunately for me, the documentation was crummy and it took a while to figure out what I needed to do. Fortunately for all that are reading this, after many hours of pain on my end, I can now write a tutorial for all the world to see.

This is very elementary in that it will only check to see if the date supplied is in the proper fomat that meets your specifications and it will check to see if the date is a proper date, meaning that someone can't try to enter a date such as 02/30/06.

In the future, I may add more robustness to this tutorial, but as it stands, this is all that I needed for my current assignment and I know that there are a number of other students stuggling with this so I thought it would be beneficial to post this tutorial as it is.

// date validation using SimpleDateFormat
// it will take a string and make sure it's in the proper 
// format as defined by you, and it will also make sure that
// it's a legal date

public boolean isValidDate(String date)
{
    // set date format, this can be changed to whatever format
    // you want, MM-dd-yyyy, MM.dd.yyyy, dd.MM.yyyy etc.
    // you can read more about it here:
    // http://java.sun.com/j2se/1.4.2/docs/api/index.html
    
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    
    // declare and initialize testDate variable, this is what will hold
    // our converted string
    
    Date testDate = null;

    // we will now try to parse the string into date form
    try
    {
      testDate = sdf.parse(date);
    }

    // if the format of the string provided doesn't match the format we 
    // declared in SimpleDateFormat() we will get an exception

    catch (ParseException e)
    {
      errorMessage = "the date you provided is in an invalid date" +
                              " format.";
      return false;
    }

    // dateformat.parse will accept any date as long as it's in the format
    // you defined, it simply rolls dates over, for example, december 32 
    // becomes jan 1 and december 0 becomes november 30
    // This statement will make sure that once the string 
    // has been checked for proper formatting that the date is still the 
    // date that was entered, if it's not, we assume that the date is invalid

    if (!sdf.format(testDate).equals(date)) 
    {
      errorMessage = "The date that you provided is invalid.";
      return false;
    }
    
    // if we make it to here without getting an error it is assumed that
    // the date was a valid one and that it's in the proper format

    return true;

} // end isValidDate


Was This Post Helpful? 0
  • +
  • -

  • (2 Pages)
  • +
  • 1
  • 2