Calendar et Juin / Juillet 2014

Fermé
edilecachan Messages postés 87 Date d'inscription dimanche 1 janvier 2012 Statut Membre Dernière intervention 26 juin 2023 - Modifié par pijaku le 18/06/2014 à 08:47
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 19 juin 2014 à 18:23
Bonjour à tous,

Je travaille avec JAVA 6u18. Je sais ça date un peu.

Un truc m'a fait tourner en bourrique :

1) Le code

  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.MONTH, Calendar.JULY);
  cal.set(Calendar.DAY_OF_MONTH, 5);
  System.out.println(cal.getTime());
  cal.add(Calendar.MONTH, -1);
  System.out.println(cal.getTime());
  System.out.println(cal.getMaximum(Calendar.DAY_OF_MONTH));
  cal.set(Calendar.DAY_OF_MONTH, cal.getMaximum(Calendar.DAY_OF_MONTH));
  System.out.println(cal.getTime());


2) Le résultat :

Sat Jul 05 07:36:31 CEST 2014
Thu Jun 05 07:36:31 CEST 2014
31
Tue Jul 01 07:36:31 CEST 2014

Et oui, le dernier jour du mois de juin 2014 est le 1er juillet 2014.
Et, c'est normal puisque juin 2014 compte 31 jours ????????????

Le seul truc que j'ai trouvé est une horrible verrue dans le code du genre :
Si le résultat est un 1er juillet, alors, nous sommes le 30 juin.

A Bon Entendeur, toutes mes amitiés, il fallait que ça sorte,





Amitiés et cordialement, Henri
A voir également:

3 réponses

Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
18 juin 2014 à 11:34
Bonjour,

Moi je dirais par logique que le problème viens de ton MONTH - 1..
0
edilecachan Messages postés 87 Date d'inscription dimanche 1 janvier 2012 Statut Membre Dernière intervention 26 juin 2023 3
19 juin 2014 à 11:14
Bonjour,

Nan, mais, c'est quand même ma fôte ma très grande fôte !!!!!
C'est une erreur de méthode JAVA de la classe Calendar :
- getMaximum donne le nombre maximum de jour d'un mois possible dans une année du calendrier considéré (pour nous, c'est évidement 31 ... , mais, j'ai cru comprendre que Calendar gérait d'autres calendriers où ça ne serait pas le cas),
- dans mon cas, il faut utiliser getActualMaximum qui donne le nombre maximum de jour du mois de la date considérée (en gérant les années bissextiles pour le mois de février).

Du coup, je ne résiste pas à l'envie de vous donner une méthode qui vas vous permettre de calculer des dates d'échéance mensuelle en tenant compte de la notion de "dernier jour du mois".
Ex :
Votre client signe le 28 février 2015.
C'est le dernier jour du mois.
Dans la logique humaine, sa prochaine échéance est le 31 mars pas le 28 mars.

Il ne suffit donc pas de juste ajouter un mois ce qui rendrait cette date du 28 mars.
Il faut tenir compte du nombre de jour du mois de départ et du nombre de jour du mois d'arrivée.
C'est ce que fais cette méthode :

private Calendar AddMois (Calendar cal, int pas) {

Calendar cal_R = Calendar.getInstance ();
cal_R.setTime(cal.getTime());
boolean fin_de_mois = (cal.get(Calendar.DAY_OF_MONTH) == cal.getActualMaximum(Calendar.DAY_OF_MONTH));
cal_R.add(Calendar.MONTH, pas);
if (fin_de_mois) {
cal_R.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
}

return cal_R;

}

0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 19/06/2014 à 18:28
Bonjour,

Plus simplement : le dernier jour du mois c'est la veille du premier jour du mois d'après.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1); // le mois d'après
cal.set(Calendar.DAY_OF_MONTH, 1); // le 1er du mois
cal.add(Calendar.DAY_OF_MONTH, -1); // la veille

Ce qui se simplifie encore :

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 0);
La confiance n'exclut pas le contrôle.
0