Bonjour,

J'ai 2 questions sur les dates.
Tout d'abord, j'ai un objet avec les attributs "annee", "mois", ...
J'ajoute ou retire des jours pour avoir la date adéquate.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
GregorianCalendar cal = new GregorianCalendar();
cal.add(GregorianCalendar.DATE, nbJours);
this.annee = cal.get(GregorianCalendar.YEAR);
this.mois = cal.get(GregorianCalendar.MONTH)+1;
this.jour = cal.get(GregorianCalendar.DATE);
this.heure = cal.get(Calendar.HOUR_OF_DAY);
this.minute = cal.get(Calendar.MINUTE); 	
this.seconde = cal.get(Calendar.SECOND);
1) Je formatte ma date comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
private long toLong () {
  return (new GregorianCalendar(this.annee, this.mois, this.jour, this.heure, this.minute)).getTimeInMillis();
  }
 
public String toString() {
  Date d = new Date(this.toLong());
  DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
  return dateFormat.format(d);
}
Et la chaîne retournée me donne le 29/10/2004.
J'ai fait des essais en ajoutant des jours et la différence reste.
Je corrige en retirant un mois mais je souhaitais savoir pourquoi.

2) Mon deuxième souci ne porte que sur les mois en 31 jours.
Je récupère une chaîne de caractères que je découpe pour initialiser les champs de mon objet.

Je fais une différence des millisecondes pour savoir combien de jours, d'heures et de minutes séparent mes 2 dates.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
public static String comparDates (MaDate debut,  MaDate fin) {
  try {
    if ((debut == null )||(fin == null))
      throw new Exception("Date de debut et/ou de fin a null");
 
    long msecDebut = debut.toLong();  
    long msecFin = fin.toLong();
    long msecEntre = msecFin - msecDebut;
 
    int nbJours = (int)(msecEntre/MSEC_DAY);
    msecEntre = msecEntre - MSEC_DAY*nbJours;
 
    int nbHeures = (int)(msecEntre/MSEC_HOUR); 
    msecEntre = msecEntre - MSEC_HOUR*nbHeures;
 
    int nbMinutes = (int)(msecEntre/MSEC_MINUTE); 
 
    StringBuffer comparSB = new StringBuffer();
    if (nbJours > 0)
      comparSB.append(""+nbJours+"j ");
    if (nbHeures > 0)
      comparSB.append(""+nbHeures+"h ");
    if (nbMinutes > 0)
      comparSB.append(""+nbMinutes+"min");
 
    if (comparSB.length()==0) {
      comparSB.append("Aucune");
      long res = msecFin-msecDebut;
      System.out.println("Debut : "+msecDebut+" "+debut.toString());
      System.out.println("Fin : "+msecFin+" "+fin.toString());
      System.out.println("Entre : "+res);
      System.out.println("Total : "+nbJours+" "+nbHeures+" "+nbMinutes);
   }
   return comparSB.toString();
 } catch (Exception e) {
 System.out.println("XKLDate : comparDates() : "+e.getMessage());
 return "";
}
}
A l'affichage de la String (exemple ci-dessous), la date est correcte.
Mais la conversion de ma date en millisecondes (par la méthode ci-dessus)
me donne ceci :

Debut : 1096666200000 31/08/2004 23h30m00s
Fin : 1096583400000 01/09/2004 00h30m00s
Entre : -82800000
Total : 0 -23 0

Il n'y a pas d'erreur d'inversion entre début et fin, les dates sont conformes et cela se produit que sur les fin de mois de 31.
Je sèche sur ce problème.

Si vous avez des idées, n'hésitez pas.

Merci d'avance