IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[Calendar] Problème de jour précédent


Sujet :

Collection et Stream Java

  1. #1
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut [Calendar] Problème de jour précédent
    Bonjour,

    J'ai un petit souci tout bête avec la classe Calendar, je n'ai rien trouvé dans la doc pour m'expliquer ce qui se passe.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    GregorianCalendar c = new GregorianCalendar();
    c.set(
    	Integer.parseInt("2006"),
    	Integer.parseInt("7"),
    	Integer.parseInt("1")
    );
     
    System.out.println(c.get(Calendar.DATE) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.YEAR));
    // on prend la date de la veille
    c.add(Calendar.DATE, -1);
    System.out.println(c.get(Calendar.DATE) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.YEAR));
    Et voici ce que j'obtiens dans la console :

    A ma connaissance (on m'aurait menti ?!?) le 31 juin n'existe pas, quelqu'un pourrait-il éclairer ma lanterne et m'indiquer où je fais l'erreur (au final bien sûr j'aimerais obtenir que la veille du 1er juillet est bien le 30 juin...).

    Merci.

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    je crois qu'il faut utiliser "lenient" pour que les controles de vallidité soient effectués ...

  3. #3
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Merci pour ta réponse, malheureusement en faisant setLenient(true) ou setLenient(false) avant d'enlever le jour le résultat reste inchangé.

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Comme l'a dit in, il existe une fonction pour obliger le calendar à vérifier si la date que tu lui passes est valide :
    When a Calendar is lenient, it accepts a wider range of field values than it produces. For example, a lenient GregorianCalendar interprets MONTH == JANUARY, DAY_OF_MONTH == 32 as February 1. A non-lenient GregorianCalendar throws an exception when given out-of-range field settings. When calendars recompute field values for return by get(), they normalize them. For example, a GregorianCalendar always produces DAY_OF_MONTH values between 1 and the length of the month.
    La fonction à utiliser est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monCalendar.setLenient(false);
    voilà voilààà

    Fred

  5. #5
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Merci Mavina, je reposte donc mon code au cas où j'utiliserais mal setLenient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    GregorianCalendar c = new GregorianCalendar();
    c.set(
    	Integer.parseInt("2006"),
    	Integer.parseInt("7"),
    	Integer.parseInt("1")
    );
     
    System.out.println(c.get(Calendar.DATE) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.YEAR));
    // on prend la date de la veille
    c.setLenient(false);
    c.add(Calendar.DATE, -1);
    System.out.println(c.get(Calendar.DATE) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.YEAR));
    Et le résultat est toujours :


  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    je tenterai avant le set pour ma part.

    mais bon ça change rien surement ...

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Points : 173
    Points
    173
    Par défaut
    Les mois sont indexés de 0 à 11....
    ton 31-6-2006 correspond donc au 31 juillet 2006.

    au cas où, pour te convaincre essaye donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GregorianCalendar c = new GregorianCalendar();
    c.set(
    	Integer.parseInt("2006"),
    	Integer.parseInt("6"),
    	Integer.parseInt("1")
    );
     
    System.out.println(new DateFormatSymbols().getMonths()[c.get(Calendar.MONTH)]);

  8. #8
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    En effet, en la plaçant juste après la déclaration de c le résultat est identique. Il doit y avoir un truc qui m'échappe car les exemples de la doc semble montrer que c'est bien la façon de faire, j'ai aussi vu un topic où pour trouver le nombre de jours dans un mois il suffisait d'aller au premier du mois suivant puis d'enlever un jour et ça semblait marcher alors que la méthode utilisée est la même...

  9. #9
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Re,

    Apres quelques tests :
    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
    import java.util.*;
     
    public class TestCalendar
    {
    	public static void main(String[] args)
    	{
     
    		GregorianCalendar c = new GregorianCalendar();
    		c.setLenient(false);
    		c.set(2006,6,31);
     
    		System.out.println(c.get(Calendar.DATE) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.YEAR));
    		// on prend la date de la veille
    		//c.setLenient(false);
    		c.add(Calendar.DATE, -1);
    		System.out.println(c.get(Calendar.DATE) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.YEAR));
    	}
    }
    Ca me renvoie bien
    31-6-2006
    30-6-2006
    Press any key to continue...
    Si je mets 32 au lieu de 31 :
    Exception in thread "main" java.lang.IllegalArgumentException
    at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:1523)
    at java.util.Calendar.updateTime(Calendar.java:1577)
    at java.util.Calendar.complete(Calendar.java:1114)
    at java.util.Calendar.get(Calendar.java:950)
    at TestCalendar.main(TestCalendar.java:12)
    Press any key to continue...
    Donc il y a un bug dans Calendar

    Voilà désolé de n'avoir pu t'aider

    Fred

  10. #10
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Citation Envoyé par dude
    Les mois sont indexés de 0 à 11....
    ton 31-6-2006 correspond donc au 31 juillet 2006.

    au cas où, pour te convaincre essaye donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GregorianCalendar c = new GregorianCalendar();
    c.set(
    	Integer.parseInt("2006"),
    	Integer.parseInt("6"),
    	Integer.parseInt("1")
    );
     
    System.out.println(new DateFormatSymbols().getMonths()[c.get(Calendar.MONTH)]);
    Arf un grand merci à toi Dude le problème était bien là en effet, tu m'enlèves une belle épine du pied pour une erreur vraiment bête... On va dire que c'est parce qu'on est lundi matin...

    Merci Mavina d'avoir pris le temps de faire quelques tests pour m'aider dans mon problème.

    Merci à vous tous pour votre aide, bonne journée

  11. #11
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    woups c'est vrai ca m'est sorti de la tête...
    Pardon James Gosling d'avoir douté de ton Calendar

    Fred

  12. #12
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    A mon humble avis, la méthode add n'est pas la plus commode dans ce cas, il faudrait que tu utilises une méthode plus adaptée à ton utilisation, je te conseille donc d'utiliser la méthode set(Calendar.DATE, -1) sans setLenient...

    PS : on a toujours besoin de son binôme, toujours...
    [EDIT] Il semblerait que j'eusse été devancé... En plus ma réponse était pas claire, je m'en remets donc à mon labeur

  13. #13
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Citation Envoyé par sozie9372
    A mon humble avis, la méthode add n'est pas la plus commode dans ce cas, il faudrait que tu utilises une méthode plus adaptée à ton utilisation, je te conseille donc d'utiliser la méthode set(Calendar.DATE, -1) sans setLenient...

    PS : on a toujours besoin de son binôme, toujours...
    [EDIT] Il semblerait que j'eusse été devancé... En plus ma réponse était pas claire, je m'en remets donc à mon labeur
    Il en va sans peine cher partenaire, merci d'avoir consacré quelques temps à mes tracas du lundi matin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème mise à jour onglet
    Par auriolbeach dans le forum Access
    Réponses: 1
    Dernier message: 25/12/2005, 14h10
  2. Problème mise à jour vers IE6 sous W2K
    Par lio33 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 11/10/2005, 12h51
  3. [HTML] Problème mise à jour des fichiers en cache
    Par El Riiico dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/09/2005, 18h00
  4. [Calendar]Problème de calcul de date
    Par valerie90 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/12/2004, 13h13
  5. [Calendar] Problème de numéro de semaine de l'année
    Par gaia_dev dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 29/11/2004, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo