Partage
  • Partager sur Facebook
  • Partager sur Twitter

Avoir le n jour ouvré d'un mois

Sujet résolu
    12 novembre 2020 à 11:44:23

    Bonjour à tous,

    Je crée une application gérant des planifications, j'ai pas mal de cas à gérer comme avoir le 1er jour d'un mois, 3 eme samedi d'un mois, etc...

    Je bloque sur le cas pour récupérer le 5eme jour ouvré d'un mois, je ne trouve pas de fonction déjà existante pour m'aider et je ne vois pas comment je peux faire...

    Si vous avez des idées je suis preneur..

    Merci d'avance

    -
    Edité par LawJava01 24 novembre 2020 à 11:16:37

    • Partager sur Facebook
    • Partager sur Twitter
      12 novembre 2020 à 18:53:54

      si tu ne trouves pas de fonction, il faut le faire "manuellement": compter 5 jours ouvrés depuis le 1er jour ouvré du mois

      -
      Edité par umfred 12 novembre 2020 à 18:54:16

      • Partager sur Facebook
      • Partager sur Twitter
        13 novembre 2020 à 8:56:57

        On peut boucler sur un localdate ? Je vois pas comment je peux faire

        -
        Edité par LawJava01 13 novembre 2020 à 9:12:42

        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2020 à 10:04:23

          c'est quoi les jours ouvrés ? comment tu ferais manuellement ?

          si 1er jour du mois = Mercredi, alors c'est le 1er jour ouvré, ........

          • Partager sur Facebook
          • Partager sur Twitter
            13 novembre 2020 à 10:12:08

            Un jour ouvré c'est un jour où on travail donc pas le Wk par exemple si le premier jour du mois c'est mercredi 01 juillet 2020 le 5eme jour ouvré c'est mardi 7 juillet car on ne compte pas le WK

            En pseudo code/java j'aurais fait ça :

            LocaleDate firstDayOFMonth = LocateDate.now().withDayOhMonth(1); // récupère le premier jour du mois
            LocalDate workingday = firstDayOhMonth.plusDays(5);              //

             Et je n'arrive pas conceptualisé la boucle...

            Tant que FirstDayOfmonth n'arrive pas à 5 et elle doit passer par des conditions pour pas compter le WK

            • Partager sur Facebook
            • Partager sur Twitter
              13 novembre 2020 à 15:30:53

              sauf que tu rajoutes 5 jours (donc tu tombes sur le 6ème jours du mois) sans tenir compte si c'est un jour ouvré (ou un jour férié)

              "brutalement", ça donnerai ça

              jour=1er jour du mois
              tant que jour = samedi ou jour = dimanche ou jour = jour_férié
                  jour=jour + 1
              cpt_jour_ouvré = 1
              tant que cpt_jour_ouvré != 5 (nb_jour_ouvré)
                  jour=jour+1
                  si jour != samedi et jour !=dimanche et jour != jour_férié
                      cpt_jour_ouvré = cpt_jour_ouvré + 1
              


              à la fin, jour est ton 5ème jour ouvré du mois

              • Partager sur Facebook
              • Partager sur Twitter
                24 novembre 2020 à 10:58:52

                Bonjour, j'ai fait ça mais quand la date est un wk ca marche pas

                public static boolean IsClosed(String date){ // Verifie que le jour J n'est pas un jour ouvré
                    
                        LocalDate Day = LocalDate.parse(date); //date entrée en parametre
                 	
                        if (Day.getDayOfWeek() == DayOfWeek.SUNDAY || Day.getDayOfWeek() == DayOfWeek.SATURDAY ){
                          //System.out.println("SD");
                          return true;
                        }else{
                          //System.out.println("LMMJV");
                          return false;
                        }
                  }
                  
                  
                  
                  public static int CalculJourOuvre(String date, int nb_jour){ // Retourne la date du nb_jour ouvre donné
                    
                    	LocalDate Day = LocalDate.parse(date); //date entrée en parametre
                		int compteur = 0;
                        
                    	//System.out.println(Day);   
                    
                    	while(compteur <= nb_jour){
                          
                          if(IsClosed(date)==true){
                             //Day = Day.plusDays(1);
                             System.out.println(Day + " 	WK");  
                          }
                          
                          if(IsClosed(date)==false){
                            //Day = Day.plusDays(1);
                            compteur++;
                            System.out.println(Day + "		Semaine"); 
                           }
                          Day = Day.plusDays(1);
                          
                        }
                    
                   
                      System.out.println(Day);    
                 
                    return 0;
                  }



                • Partager sur Facebook
                • Partager sur Twitter
                  24 novembre 2020 à 11:38:19

                  Ligne 34 tu incrémentes la variable Day (pk le d est majuscule?), mais tu testes la variable date.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 novembre 2020 à 11:44:10

                    Si je test Day, j'ai un problème de type et je peux pas utiliser plusDay sur date car c'est un string pas un LocalDate.

                    Effectivement j'ai compris pq ca ne marchait pas mais je trouve pas d’alternative, c'est mon typage qui n'est pas bon ? 

                    -
                    Edité par LawJava01 24 novembre 2020 à 11:46:31

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 novembre 2020 à 11:51:05

                      Une méthode isClosed() qui prend un LocalDate en paramètre?

                      Et Nomme tes variables en lower camel case (maVariable).

                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 novembre 2020 à 12:56:08

                        IsClosed prend mtn LocalDate en parémetre du coup CalculJourOuvre aussi

                        Cependant, je pense que j'ai un probleme au niveau de l'algo non ? Ca affiche pas la bonne date a chaque fois

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 novembre 2020 à 13:04:12

                          c'est un décalage constant ?  plus ou moins un jour ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 novembre 2020 à 14:14:25

                            umfred a écrit:

                            c'est un décalage constant ?  plus ou moins un jour ?


                             public static boolean IsClosed(LocalDate date){ // Verifie que le jour J n'est pas un jour ouvré
                                
                                    //Local-date Day = LocalDate.parse(date); //date entrée en parametre
                             	
                                    if (date.getDayOfWeek() == DayOfWeek.SUNDAY || date.getDayOfWeek() == DayOfWeek.SATURDAY ){
                                      //System.out.println("SD");
                                      return true;
                                    }else{
                                      //System.out.println("LMMJV");
                                      return false;
                                    }
                              }
                              
                              
                              
                              public static int CalculJourOuvre(LocalDate day, int nb_jour){ // Retourne la date du nb_jour ouvre donné
                                
                                	
                            		int compteur = 0;
                                    
                                	//System.out.println(Day);   
                                
                                	while(compteur <= nb_jour){
                                       System.out.println(compteur + " : " + day);
                                      
                                      if(IsClosed(day)==true){
                                       
                                         //System.out.println(compteur + "WK"); 
                                         day = day.plusDays(1);
                                      }
                                     
                                      if(IsClosed(day)==false){
                            
                                        compteur++;
                                        //System.out.println(compteur + "semaine");
                                        day = day.plusDays(1);
                                       }
                                    }
                                
                               
                                  System.out.println(day);    
                             
                                return 0;
                              }
                              
                              
                              
                            Saisir une date sous le format AAAA-MM-JJ: 2020-12-17
                            0 : 2020-12-17
                            1 : 2020-12-18
                            2 : 2020-12-19
                            2 : 2020-12-20
                            3 : 2020-12-22
                            2020-12-23
                            Je comprend plus rien
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 novembre 2020 à 14:17:48

                              LawJava a écrit:

                              umfred a écrit:

                              c'est un décalage constant ?  plus ou moins un jour ?


                               public static boolean IsClosed(LocalDate date){ // Verifie que le jour J n'est pas un jour ouvré
                                  
                                      //Local-date Day = LocalDate.parse(date); //date entrée en parametre
                               	
                                      if (date.getDayOfWeek() == DayOfWeek.SUNDAY || date.getDayOfWeek() == DayOfWeek.SATURDAY ){
                                        //System.out.println("SD");
                                        return true;
                                      }else{
                                        //System.out.println("LMMJV");
                                        return false;
                                      }
                                }
                                
                                
                                
                                public static int CalculJourOuvre(LocalDate day, int nb_jour){ // Retourne la date du nb_jour ouvre donné
                                  
                                  	
                              		int compteur = 0;
                                      
                                  	//System.out.println(Day);   
                                  
                                  	while(compteur <= nb_jour){
                                         System.out.println(compteur + " : " + day);
                                        
                                        if(IsClosed(day)==true){
                                         
                                           //System.out.println(compteur + "WK"); 
                                           day = day.plusDays(1);
                                        }
                                       
                                        if(IsClosed(day)==false){
                              
                                          compteur++;
                                          //System.out.println(compteur + "semaine");
                                          day = day.plusDays(1);
                                         }
                                      }
                                  
                                 
                                    System.out.println(day);    
                               
                                  return 0;
                                }
                                
                                
                                
                              Saisir une date sous le format AAAA-MM-JJ: 2020-12-17
                              0 : 2020-12-17
                              1 : 2020-12-18
                              2 : 2020-12-19
                              2 : 2020-12-20
                              3 : 2020-12-22
                              2020-12-23
                              Je comprend plus rien
                              Pour Jeudi 17/12/2020, j'ajoute 3 jours on est censé avoir Lundi 21/12/2020

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 novembre 2020 à 14:18:54

                                si tu avais l'algo que j'ai donné plus haut, tu n'aurais pas du avoir de problème :-° (regarde par exemple où tu as placé l'incrémentation du jour par rapport à mon algo: tu ne testes pas si le jour+1 est en semaine ou en week end)

                                Edit suite à ton post (ma réponse a croisée la tienne):

                                jeudi 17/12/2020 + 3 jours ouvrés ça donne le mardi 22/12/2020 (vendredi =+1; lundi=+2, mardi=+3)

                                -
                                Edité par umfred 24 novembre 2020 à 14:22:12

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 novembre 2020 à 14:22:06

                                  Deja il faudrait un else, la tu peux entrer dans les deux if au meme tour.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 novembre 2020 à 14:27:15

                                    int compteur = 1;
                                            
                                        	//System.out.println(Day);   
                                        
                                        	while(IsClosed(day)==true){
                                               day = day.plusDays(1);
                                            }
                                        
                                        	while(compteur != nb_jour){
                                              day = day.plusDays(1);
                                              if(IsClosed(day)==false)
                                              compteur++;
                                          
                                            }
                                    
                                          System.out.println(day);    
                                    Mdr ça marche, merci
                                    J'ai essaye de faire ce que j'avais en tête mais c’était pas très efficace

                                    thetui a écrit:

                                    Deja il faudrait un else, la tu peux entrer dans les deux if au meme tour.

                                    umfred a écrit:

                                    si tu avais l'algo que j'ai donné plus haut, tu n'aurais pas du avoir de problème :-° (regarde par exemple où tu as placé l'incrémentation du jour par rapport à mon algo: tu ne testes pas si le jour+1 est en semaine ou en week end)

                                    Edit suite à ton post (ma réponse a croisée la tienne):

                                    jeudi 17/12/2020 + 3 jours ouvrés ça donne le mardi 22/12/2020 (vendredi =+1; lundi=+2, mardi=+3)

                                    -
                                    Edité par umfred il y a 5 minutes

                                    Ah je ne savais pas quon pouvait pas faire 2 if dans une meme boucle, je pensais que ca allait s 'enchainer
                                    Ca depend si on compte le jour j comme un jour ouvre non ? si oui je met le compteur a 1 sinon 0 ?



                                    -
                                    Edité par LawJava01 24 novembre 2020 à 14:32:50

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 novembre 2020 à 14:47:03

                                      JeuneCodeur a écrit:

                                      Ah je ne savais pas quon pouvait pas faire 2 if dans une meme boucle, je pensais que ca allait s 'enchainer
                                      Ca depend si on compte le jour j comme un jour ouvre non ? si oui je met le compteur a 1 sinon 0 ?


                                      On peut mettre plusieurs if dans une même boucle mais si on teste un truc et son contraire autant utiliser un if ... else (surtout si on ne veut pas que l'on a modifié dans le 1er if soit pris en compte dans le 2nd if)

                                      -
                                      Edité par umfred 24 novembre 2020 à 14:48:38

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 novembre 2020 à 14:52:02

                                        Oui oui c'est ce que j'avais fait de base, mais je pensais qu'il rentrait pas dans le if du coup à force de modifier j'avais laissé comme ça

                                        Après plusieurs tests ça a l'air de marche, merci !

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Avoir le n jour ouvré d'un mois

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown