Vérifier si deux dates Java sont le même jour

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons découvrir plusieurs façons différentes de vérifier si deux objets java.util.Date ont le même jour .

Nous commencerons par examiner les solutions utilisant le noyau Java - à savoir les fonctionnalités de Java 8 - avant d'examiner quelques alternatives pré-Java 8.

Pour finir, nous examinerons également certaines bibliothèques externes - Apache Commons Lang, Joda-Time et Date4J .

2. Core Java

La classe Date représente un instant spécifique dans le temps, avec une précision de la milliseconde . Pour savoir si deux objets Date contiennent le même jour, nous devons vérifier si l'Année-Mois-Jour est le même pour les deux objets et ignorer l'aspect temporel .

2.1. Utilisation de LocalDate

Avec la nouvelle API Date-Time de Java 8, nous pouvons utiliser l' objet LocalDate . Il s'agit d'un objet immuable représentant une date sans heure.

Voyons comment nous pouvons vérifier si deux objets Date ont le même jour en utilisant cette classe:

public static boolean isSameDay(Date date1, Date date2) { LocalDate localDate1 = date1.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); LocalDate localDate2 = date2.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); return localDate1.isEqual(localDate2); }

Dans cet exemple, nous avons converti les deux objets Date en LocalDate en utilisant le fuseau horaire par défaut . Une fois convertis, il suffit de vérifier si les objets LocalDate sont égaux en utilisant la méthode isEqual .

Par conséquent, en utilisant cette approche, nous serons en mesure de déterminer si les deux objets Date contiennent le même jour.

2.2. Utiliser Instant

Dans l'exemple ci-dessus, nous avons utilisé Instant comme objet intermédiaire lors de la conversion des objets Date en objets LocalDate . Instant , introduit dans Java 8, représente un moment précis .

Nous pouvons directement tronquer les objets Instant à l'unité DAYS , qui définit les valeurs du champ de temps à zéro, puis nous pouvons les comparer:

public static boolean isSameDayUsingInstant(Date date1, Date date2) { Instant instant1 = date1.toInstant() .truncatedTo(ChronoUnit.DAYS); Instant instant2 = date2.toInstant() .truncatedTo(ChronoUnit.DAYS); return instant1.equals(instant2); }

2.3. Utilisation de SimpleDateFormat

Depuis les premières versions de Java, nous avons pu utiliser la classe SimpleDateFormat pour effectuer une conversion entre les représentations d'objets Date et String . Cette classe prend en charge la conversion à l'aide de nombreux modèles. Dans notre cas, nous utiliserons le modèle «aaaaMMjj» .

En utilisant cela, nous formaterons la date, la convertirons en objet String , puis les comparerons à l'aide de la méthode standard equals :

public static boolean isSameDay(Date date1, Date date2) { SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); return fmt.format(date1).equals(fmt.format(date2)); }

2.4. Utilisation du calendrier

La classe Calendar fournit des méthodes pour obtenir les valeurs de différentes unités de date et d'heure pour un instant donné.

, Il faut d' abord créer un calendrier instance et définir les calendrier du temps des objets en utilisant chacune des dates prévues. Ensuite, nous pouvons interroger et comparer les attributs Année-Mois-Jour individuellement pour déterminer si les objets Date ont le même jour:

public static boolean isSameDay(Date date1, Date date2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(date1); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(date2); return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH) && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH); }

3. Bibliothèques externes

Maintenant que nous avons une bonne compréhension de la façon de comparer des objets Date à l'aide des nouvelles et anciennes API proposées par le noyau Java, examinons quelques bibliothèques externes.

3.1. Apache Commons Lang DateUtils

La classe DateUtils fournit de nombreux utilitaires utiles qui facilitent le travail avec les anciens objets Calendar et Date .

L'artefact Apache Commons Lang est disponible auprès de Maven Central:

 org.apache.commons commons-lang3 3.9 

Ensuite, nous pouvons simplement utiliser la méthode isSameDay de DateUtils :

DateUtils.isSameDay(date1, date2);

3.2. Bibliothèque Joda-Time

Une alternative à la bibliothèque Java Date and Time principale est Joda-Time. Cette bibliothèque largement utilisée constitue un excellent substitut lorsque vous travaillez avec la date et l'heure .

L'artefact peut être trouvé sur Maven Central:

 joda-time joda-time 2.10 

Dans cette bibliothèque, org.joda.time.LocalDate représente une date sans heure . Par conséquent, nous pouvons construire les objets LocalDate à partir des objets java.util.Date , puis les comparer:

public static boolean isSameDay(Date date1, Date date2) { org.joda.time.LocalDate localDate1 = new org.joda.time.LocalDate(date1); org.joda.time.LocalDate localDate2 = new org.joda.time.LocalDate(date2); return localDate1.equals(localDate2); }

3.3. Bibliothèque Date4J

Date4j fournit également une implémentation simple et directe que nous pouvons utiliser.

De même, il est également disponible auprès de Maven Central:

 com.darwinsys hirondelle-date4j 1.5.1 

En utilisant cette bibliothèque, nous devons construire l' objet DateTime à partir d'un objet java.util.Date . Ensuite, nous pouvons simplement utiliser la méthode isSameDayAs :

public static boolean isSameDay(Date date1, Date date2) { DateTime dateObject1 = DateTime.forInstant(date1.getTime(), TimeZone.getDefault()); DateTime dateObject2 = DateTime.forInstant(date2.getTime(), TimeZone.getDefault()); return dateObject1.isSameDayAs(dateObject2); }

4. Conclusion

Dans ce rapide didacticiel, nous avons exploré plusieurs façons de vérifier si deux objets java.util.Date contiennent le même jour.

Comme toujours, le code source complet de l'article est disponible à l'adresse over sur GitHub.