Montre mécanique

Transformer une String en Date en Java et vérifier sa validité

Publié dans Java | Marqué avec , ,
Share

Dans un précédent billet Petit point sur SimpleDateFormat, on a vu l’utilisation de SimpleDateFormat, et on va que c’était relativement simple. Plusieurs exemples montraient comment utiliser format pour transformer une date en une chaîne de caractère formatée selon notre bon plaisir. Un court exemple présentait la méthode parse qui effectue l’opération inverse : transforme une chaîne de caractère dans un format bien défini, en une date. Le but de ce billet est d’aller un peu plus loin avec parse pour voir comment il est possible de gérer les différents cas d’erreurs.

Prenons un premier exemple. Définissons un format de date : dd/MM/yyyy. Aujourd’hui nous sommes le 1er juillet 2010, par conséquent la date du jour dans le format que l’on vient de définir s’écrie : 01/07/2010. On va donc récupérer une chaîne de caractère et la transformer en date avec parse, puis vérifier que l’on obtient le bon résultat. L’exemple ci-dessous affiche : « Date parsée : Fri Mar 18 00:00:00 CET 1988 ».

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
	date = dateFormat.parse("18/03/1988");
	System.out.println("Date parsée : "+date);
} catch (Exception e) {
	System.err.println("Format de date invalide. Usage : dd/MM/YYYY");
	System.err.println(e.getMessage());
}

On pourrait faire tout un tas de test avec une date au format souhaitée : ça fonctionnerait. Super ! Maintenant, essayons une date qui n’est pas au bon format.

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date1 = null;
Date date2 = null;
Date date3 = null;
try {
	date1 = dateFormat.parse("18 mars 1988");
	date2 = dateFormat.parse("18/03/88");
	date3 = dateFormat.parse("azerty");
	System.out.println("Date parsée 1 : "+date1);
	System.out.println("Date parsée 2 : "+date2);
	System.out.println("Date parsée 3 : "+date3);
} catch (Exception e) {
	System.err.println("Format de date invalide. Usage : dd/MM/YYYY");
	System.err.println(e.getMessage());
}

Une exception est renvoyée dès le premier appel à parse, donc, cet exemple affiche :

Format de date invalide. Usage : dd/MM/YYYY
Unparseable date: « 18 mars 1988 »

L’exemple « 18/03/88 » fonctionnera parce que Java fait ses petits calculs dans son coin, mais « azerty » ne fonctionnera pas du tout.
Maintenant, essayons une date au bon format mais complètement invalide. L’exemple suivant avec la date « 35/03/1988 » (qui n’existe pas, on est d’accord ?) affiche : « Date parsée : Mon Apr 04 00:00:00 CEST 1988 ».

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
	date = dateFormat.parse("35/03/1988");
	System.out.println("Date parsée : "+date);
} catch (Exception e) {
	System.err.println("Format de date invalide. Usage : dd/MM/YYYY");
	System.err.println(e.getMessage());
}

Dans le même genre, « 18/56/1988 » affichera : « Tue Aug 18 00:00:00 CEST 1992 ». Bref, Java fait ses petits calculs on ne sait pas trop comment mais le résultat c’est que ça ne nous plait pas. La solution consiste à préciser que l’on veut des dates valides aussi sémantiquement.

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
dateFormat.setLenient(false);
Date date = null;
try {
	date = dateFormat.parse("18/56/1988");
	System.out.println("Date parsée : "+date);
}
catch (Exception e) {
	System.err.println("Format de date invalide. Usage : dd/MM/YYYY");
	System.err.println(e.getMessage());
}

Ce qui renvoie ce que l’on souhaite voir :

Format de date invalide. Usage : dd/MM/YYYY
Unparseable date: « 18/56/1988 »

Pour la petite histoire, « lenient » signifie en anglais « indulgent », on peut donc dire que Java est naturellement indulgent, mais qu’on peut facilement le rendre intransigeant ! (mais pas tant que ça puisqu’il comprend toujours bien « 18/03/88 », ouf)

2 Responses to Transformer une String en Date en Java et vérifier sa validité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *