Comparer 2 dates en Java avec compareTo, before, after et equals

Publié dans Java | Marqué avec ,
Share

Java permet aussi de comparer très facilement deux dates entre elles. Pour voir comment cela se passe en vrai, nous allons ré-utiliser les exemples prient pour le billet Transformer une String en Date en Java et vérifier sa validité comme ça on pourra lire facilement les dates.
Pour comparer 2 dates, on peut utiliser compareTo qui a le mérite d’être puissante mais de nécessiter une petite lecture de la doc pour connaître le sens de lecture. Sinon, on peut se limiter à l’utilisation de before et after. Le tout est de bien savoir dans quel sens on travaille.

Pour tous les exemples ci-dessous je réfléchis de la manière suivante : dateAComparer.comparateur(datePasséeEnArgument)

Compare To

Commençons par un exemple avec compareTo.

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date1 = null;
Date date2 = null;
try {
	date1 = dateFormat.parse("18/03/1988");
	date2 = dateFormat.parse("20/03/1988");
	System.out.println("date 1 : "+dateFormat.format(date1)+" compareTo date2 : "+dateFormat.format(date2)+" -> "+date1.compareTo(date2));
	System.out.println("date 2 : "+dateFormat.format(date2)+" compareTo date1 : "+dateFormat.format(date1)+" -> "+date2.compareTo(date1));
	System.out.println("date 1 : "+dateFormat.format(date1)+" compareTo date1 : "+dateFormat.format(date1)+" -> "+date1.compareTo(date1));
} catch (Exception e) {
	System.err.println("date1 et/ou date2 invalide. Format à utiliser : dd/MM/YYYY");
	System.err.println(e.getMessage());
}

Le code ci-dessus affiche :

date 1 : 18/03/1988 compareTo date2 : 20/03/1988 -> -1
date 2 : 20/03/1988 compareTo date1 : 18/03/1988 -> 1
date 1 : 18/03/1988 compareTo date1 : 18/03/1988 -> 0

On peut donc résumer ceci ainsi :

  • -1 : la date à comparer est antérieure à la date passée en argument
  • 1 : la date à comparer est postérieure à la date passée en argument
  • 0 : les 2 dates sont identiques

Plus simplement avec before, after et equals

On peut parfois se casser un petit peu moins la tête en utilisant before, after ou equals. Ces méthodes renvoient un boolean (true ou false) et ma foi leur nom est suffisement explicite pour savoir ce qu’elles font, il suffit de se mettre dans la tête qu’il faut réfléchir par rapport à la date à comparer. Le code ci-dessous fournit un exemple pour les 3 méthodes :

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date1 = null;
Date date2 = null;
Date date3 = null;
try {
	date1 = dateFormat.parse("18/03/1988");
	date2 = dateFormat.parse("20/03/1988");
	date3 = dateFormat.parse("18/03/1988");
	System.out.println("date 1 : "+dateFormat.format(date1)+" before date2 : "+dateFormat.format(date2)+" -> "+date1.before(date2));
	System.out.println("date 2 : "+dateFormat.format(date2)+" before date1 : "+dateFormat.format(date1)+" -> "+date2.before(date1));
	System.out.println("date 1 : "+dateFormat.format(date1)+" before date1 : "+dateFormat.format(date1)+" -> "+date1.before(date1));
	System.out.println("---");
	System.out.println("date 1 : "+dateFormat.format(date1)+" after date2 : "+dateFormat.format(date2)+" -> "+date1.after(date2));
	System.out.println("date 2 : "+dateFormat.format(date2)+" after date1 : "+dateFormat.format(date1)+" -> "+date2.after(date1));
	System.out.println("date 1 : "+dateFormat.format(date1)+" after date1 : "+dateFormat.format(date1)+" -> "+date1.after(date1));
	System.out.println("---");
	System.out.println("date 1 : "+dateFormat.format(date1)+" equals date2 : "+dateFormat.format(date2)+" -> "+date1.equals(date2));
	System.out.println("date 2 : "+dateFormat.format(date2)+" equals date1 : "+dateFormat.format(date1)+" -> "+date2.equals(date1));
	System.out.println("date 1 : "+dateFormat.format(date1)+" equals date1 : "+dateFormat.format(date1)+" -> "+date1.equals(date1));
	System.out.println("date 1 : "+dateFormat.format(date1)+" equals date3 : "+dateFormat.format(date1)+" -> "+date1.equals(date3));
} catch (Exception e) {
	System.err.println("date1 et/ou date2 invalide. Format à utiliser : dd/MM/YYYY");
	System.err.println(e.getMessage());
}

Ce qui affiche :

date 1 : 18/03/1988 before date2 : 20/03/1988 -> true
date 2 : 20/03/1988 before date1 : 18/03/1988 -> false
date 1 : 18/03/1988 before date1 : 18/03/1988 -> false

date 1 : 18/03/1988 after date2 : 20/03/1988 -> false
date 2 : 20/03/1988 after date1 : 18/03/1988 -> true
date 1 : 18/03/1988 after date1 : 18/03/1988 -> false

date 1 : 18/03/1988 equals date2 : 20/03/1988 -> false
date 2 : 20/03/1988 equals date1 : 18/03/1988 -> false
date 1 : 18/03/1988 equals date1 : 18/03/1988 -> true
date 1 : 18/03/1988 equals date3 : 18/03/1988 -> true

Comme on peut le voir sur l’exemple avec equals, j’ai utilisé une troisième date date3 positionnée au 18 mars 1988 comme la date1 pour vérifier que l’on avait bien une égalité de date et non d’instance. Au moins maintenant, je suis convaincu !
Avec tout ça, je ne vois plus trop l’utilité d’utiliser compareTo dans une condition… J’ai l’impression que c’est une méthode générique de Java et qu’il est plus conseillé d’utiliser before, after ou equals pour des dates.

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>

*