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 réponses à Transformer une String en Date en Java et vérifier sa validité

  1. Pierre Billard

    Bonjour j’ai fait comme toi pour avoir une date mais je voudrai avoir juste la date en format dd/MM/yyyy je ne comprend pas pourquoi j’ai par exemple
    Mon Sep 15 00:00:00 CEST 2008
    si j’ai mis en paramètre 15/09/2008

    en gros je voudrai avoir ma date de type Date dans la même forme que mon String

    merci par avance

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*