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