Exemples de comparaison de dates en Java

Base de données avec la table employee cotnenant la date d'embauche et la date actuelle :

Code de test :

  1 package exemplesdates;
  2 
  3 import java.sql.Connection;
  4 import java.sql.DriverManager;
  5 import java.sql.ResultSet;
  6 import java.sql.Statement;
  7 import java.text.SimpleDateFormat;
  8 import java.util.Calendar;
  9 import java.util.Date;
 10 
 11 public class ComparaisonDates {
 12     
 13     public static void main(String args[]) throws Exception{
 14         Class.forName("com.mysql.jdbc.Driver");
 15         Connection connexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo?user=root&password=root");
 16         Statement declaration = connexion.createStatement();
 17         ResultSet resultat = declaration.executeQuery("select * from employee");
 18         
 19         while(resultat.next()){
 20             String dateEmbaucheStr = resultat.getString("date_embauche");
 21             Date dateEmbauche = new SimpleDateFormat("yyyy-MM-dd").parse(dateEmbaucheStr);
 22             System.out.println("(Méthode 1) Jours depuis l'embauche : " + calculerJours(new Date(), dateEmbauche));
 23             System.out.println("(Méthode 2) Jours depuis l'embauche : " + joursIntervalle(new Date(), dateEmbauche));
 24             System.out.println("Mois depuis l'embauche : " + obtenirMoisIntervalle(dateEmbauche, new Date()));
 25             System.out.println("L'embauche date de plus de 2 mois : " + depasseMois(dateEmbauche, 2));
 26             System.out.println("L'embauche date de plus de 6 mois : " + depasseMois(dateEmbauche, 6));
 27             System.out.println("L'embauche date de plus de 2 semaines : " + depasseSemaines(dateEmbauche, 2));
 28             
 29             System.out.println();
 30         }
 31         
 32         resultat.close();
 33         declaration.close();
 34         connexion.close();
 35     }
 36     
 37     //Vérifie si la date d'embauche est antérieure à il y a n mois
 38     public static boolean depasseMois(Date dateEmbauche, int n){
 39         boolean resultat = false;
 40 
 41         Calendar calendrier = Calendar.getInstance();
 42         calendrier.add(Calendar.MONTH, n);
 43         
 44         if(dateEmbauche.after(calendrier.getTime())){
 45             resultat = true;
 46         }
 47         
 48         return resultat;
 49     }
 50     
 51     //Vérifie si l'embauche date de plus de n semaines
 52     /**
 53      * Calendar.DATE  : représente les jours
 54      * Calendar.WEDNESDAY: représente les semaines
 55      * Calendar.MONTH : représente les mois
 56      * Calendar.YEAR : représente les années
 57      */
 58     public static boolean depasseSemaines(Date dateEmbauche, int n){
 59         boolean resultat = false;
 60 
 61         Calendar calendrier = Calendar.getInstance();
 62         calendrier.add(Calendar.WEDNESDAY, n);
 63         System.out.println("Date "+n+" semaines plus tard : " + calendrier.getTime());
 64         
 65         if(dateEmbauche.after(calendrier.getTime())){
 66             resultat = true;
 67         }
 68         
 69         return resultat;
 70     }
 71     
 72     /**
 73      * Calcule le nombre de mois entre deux dates
 74      * La méthode n'est pas précise pour les jours, calcule seulement le nombre de mois
 75      */
 76     public static int obtenirMoisIntervalle(Date debut, Date fin){
 77         if(debut.after(fin)){
 78             Date temp = debut;
 79             debut = fin;
 80             fin = temp;
 81         }
 82         
 83         Calendar calendrier = Calendar.getInstance();
 84         calendrier.setTime(debut);
 85         int annee1 = calendrier.get(Calendar.YEAR);
 86         int mois1 = calendrier.get(Calendar.MONTH);
 87         
 88         calendrier.setTime(fin);
 89         int annee2 = calendrier.get(Calendar.YEAR);
 90         int mois2 = calendrier.get(Calendar.MONTH);
 91         
 92         int resultat;
 93         if(annee1==annee2){
 94             resultat = mois2 - mois1;
 95         }else{
 96             resultat = 12*(annee2-annee1) + mois2 - mois1;
 97         }
 98         
 99         return resultat;
100     }
101     
102     /**
103      * Calcule la différence en jours avec la date actuelle - Méthode 1
104      * Utilise les millisecondes pour calculer la différence
105      */
106     public static int calculerJours(Date date1, Date date2){
107         if(date1.after(date2)){
108             Date temp = date1;
109             date1 = date2;
110             date2 = temp;
111         }
112         long intervalleMilli = date2.getTime() - date1.getTime();
113         return (int)(intervalleMilli/(24*60*60*1000));
114     }
115     
116     /**
117      * Calcule la différence en jours avec la date actuelle - Méthode 2
118      * <strong>Correction : cette méthode initiale était incorrecte. La version corrigée suit ci-dessous!</strong>
119      * Utilise le calendrier pour calculer la différence en jours
120      */
121     public static int joursIntervalle(Date date1, Date date2){
122         if(date1.after(date2)){
123             Date temp = date1;
124             date1 = date2;
125             date2 = temp;
126         }
127         Calendar calendrier = Calendar.getInstance();
128         calendrier.setTime(date1);
129         int jour1 = calendrier.get(Calendar.DAY_OF_YEAR);
130         calendrier.setTime(date2);
131         int jour2 = calendrier.get(Calendar.DAY_OF_YEAR);
132         return jour2 - jour1;
133     }
134 }

Correction : La méthode de calcul de jours par calendrier était incorrecte pour les années différentes. Voici la version corrigée :

package exemplesdates;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TestDatesCorrige {

    public static void main(String[] args) throws ParseException {
        String str = "2010-08-19 14:20:00";
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date date1 = format.parse(str);
        Date date2 = new Date();

        System.out.println(calculJoursMethode1(date1, date2));
        System.out.println(calculJoursMethode2(date1, date2));
    }

    /**
     * Méthode 1
     * Calcule la différence en jours entre deux dates (date1 < date2)
     * Utilise le calendrier pour calculer la différence
     * @param date1
     * @param date2
     * @return
     */
    public static int calculJoursMethode1(Date date1, Date date2){
        Calendar calendrier = Calendar.getInstance();
        calendrier.setTime(date1);
        int jour1 = calendrier.get(Calendar.DAY_OF_YEAR);
        int annee1 = calendrier.get(Calendar.YEAR);

        calendrier.setTime(date2);
        int jour2 = calendrier.get(Calendar.DAY_OF_YEAR);
        int annee2 = calendrier.get(Calendar.YEAR);

        if (annee1 != annee2) {   //Années différentes
            int distanceTemps = 0;
            for (int i = annee1; i < annee2; i++) {
                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {  //Année bissextile
                    distanceTemps += 366;
                }else{  //Année normale
                    distanceTemps += 365;
                }
            }
            return distanceTemps + (jour2 - jour1);
        }else{
            return jour2 - jour1;
        }
    }

    /**
     * Méthode 2
     * Calcule la différence en jours entre deux dates (date1 < date2)
     * Convertit d'abord les dates au format année-mois-jour, puis utilise les millisecondes
     * @param date1
     * @param date2
     * @return
     */
    public static int calculJoursMethode2(Date date1, Date date2){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date jour1 = format.parse(format.format(date1));
            Date jour2 = format.parse(format.format(date2));
            int joursIntervalle = (int) ((jour2.getTime() - jour1.getTime()) / (1000 * 60 * 60 * 24));
            return joursIntervalle;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Erreur de calcul des jours");
        }
        return 0;
    }

}

Résultat affiché dans la console :

3289
3289

Étiquettes: Java dates calendar SimpleDateFormat comparaison

Publié le 28 juin à 03h25