calcul du nombre de jours ouvrés entre 2 dates

calcul du nombre de jours ouvrés entre 2 dates - PHP - Programmation

Marsh Posté le 18-03-2004 à 17:36:52    

Bonjour,
 
Existe-t-il (ou qqn a-t-il déjà écrit) une fonction qui retourne le nombre de jours ouvrés entre 2 dates passés en paramètre?
 
Exemple: nb_jours_ouvrés(2004-03-12, 2004-03-18) renvoie 5
 
Merci beaucoup!
 
Al

Reply

Marsh Posté le 18-03-2004 à 17:36:52   

Reply

Marsh Posté le 18-03-2004 à 17:57:19    

Je n'en connais pas de toute faite...
 
La seule réelle difficultée, c'est les jours fériers 'mobiles'.
 
Mais pour çà, j'ai la solution :
 
http://www.surleau.com/hfr/paques.php


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 18-03-2004 à 18:20:14    

Peut-être que les difficultés ne sont pas "réelles", mais, étant débutante dans la programmation, je n'arrive pas à les surmonter ;-)

Reply

Marsh Posté le 18-03-2004 à 18:24:15    

J'avais pas trouvé les smileys, je recommence donc :  
Pourais-tu m'aider un peu plus s'il te plait?  :??:

Reply

Marsh Posté le 18-03-2004 à 18:41:25    

Arf, je vais voir ce que je peux faire, mais compte pas trop avoir du code tout fait. Faut bosse un peu quand même, et c'est pas le genre du forum (des fois je le fais et ensuite on me dis que c'est pas bien...) :D
 
D'abord, qu'est-ce que tu vois comme algo pour ton calcul ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 18-03-2004 à 19:35:05    

Pour les algos, ca devrait pouvoir s'arranger [:figti]  
Mais ces dates, elles viennent d'où ? D'une base de données ?


Message édité par mrbebert le 18-03-2004 à 19:53:05
Reply

Marsh Posté le 18-03-2004 à 23:40:50    

Reply

Marsh Posté le 19-03-2004 à 09:39:31    

C'est bien ce qui m'embête: je n'ai pas la moindre idée de comment orienter mon algo, à part faire du "cas par cas".
Récupérer le jour (lundi...) des 2 dates d1 et d2
- si les 2 dates sont en semaine, faire: durée=d2-d1+1, division entière par 7 pour trouver le nombre de semaine et donc le nb de jours à enlever à durée --> jours_semaine
- si d1 samedi ou dimanche, se ramener au lundi et faire comme ci-dessus.
- si d2 samedi ou dimanche, se ramener au vendredi et faire comme ci-dessus.
 
D'autre part, calculer les jours fériés mobiles pour l'année considérée. Pour chacun de ces jours et des jours fériés fixes, tester s'ils sont dans l'intervalle d1-d2 et enlever le nb de jours nécéssaires.
 
Bref, ça m'a l'air vraiment très bourrin, je pense qu'il doit y avoir une solution plus "jolie".
 
Pour répondre à la question (et je m'arrêterai là, vu la longueur du message!), une des dates vient d'une base de donnée, l'autre est la date du jour.
 
Merci pour votre aide!  :)  
 
Al

Reply

Marsh Posté le 19-03-2004 à 12:20:36    

Ben il à l'air pas mal ton algo !
 
Sauf :
Vérifier pour les jours férier fixes qu'il ne tombent pas un samedi ou un dimanche que tu as déjà décompté.
 
Si tu veux faire une fonction vraiement générique fait attention à une chose, l'intervalle peut s'étaler sur plusieurs années...
 
Une implémentation possible serait de faire une fonction pour un interval sur une année. Une autre fonction plus générale découpe l'intervalle fournis par année et appelle la première fonction.
 
Amuse toi bien :D
 
PS : Y'a un jour férier qui va sauter un de ces 4...
Infos : http://perso.wanadoo.fr/milisoft/stuff/
Pour le moment, c'est à partir de 2005 que théoriquement le lundi de Pentecôte doit sauter.
http://perso.wanadoo.fr/milisoft/s [...] echos.html
Mais rien n'est encore définitif...
Je sens que çà va pas simplifier l'algo çà :D


Message édité par Mara's dad le 19-03-2004 à 12:28:29

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 19-03-2004 à 18:02:09    

Non, ça c'est rien par rapport à ce que je ne vous ai pas dit! J'ai posé ma question pour avoir un début de piste, mais j'ai une autre contrainte dont je ne vous ai pas parlé.
 
En fait, je travaille sur l'évolution d'un outil de déclaration de bugs (Mantis pour ceux qui connaissent). On a un délai $delai (connu, entendu avec le client, en jours ouvrés) à respecter pour corriger les bugs.  
Je veux faire un script que je lancerai toutes les nuits et qui calcule le nombre de jours ouvrés entre la date actuelle et celle de déclaration du bug (provenant d'une table), et le compare à $délai. Cela dans le but d'envoyer un mail au manager si le délai est dépassé.
Rajoutez à cela qu'on ne compte pas forcément en jours entiers mais par tranche de 0.25j: c'est un vrai casse-tête !
 
Après y avoir réfléchi une bonne partie de l'après-midi, je me demande si c'est vraiment faisable.
 
Ex : bug déclaré samedi à 10h (on sait jamais, que les clients travaillent le WE!). Script lancé lundi à 22h. Il faut que cela revienne à ce que le bug ait été déclaré le lundi matin et qu'il y ait donc eu 1j d'écoulé.
 
Autre ex : bug déclaré lundi à 16h. Script exécuté lundi à 22h.
Il faut tenir compte des horaires (officiels) de travail. Disons qu'une journée fait 8h et qu'on travaille jusqu'à 18h. Il faut que le script me renvoit donc qu'il y a eu 0.25j d'écoulé.
 
Si qqn a réussi à comprendre ce que doit faire mon script et a une idée d'un algo, n'hésitez pas !!!
J'ai essayé plusieurs pistes, mais je n'arrive pas à qqch de correct! J'avoue que je désespère un peu et je me demande si ce que je veux est réalisable.  :??:  
 
Merci encore!  :)  
 
A+  :hello:  
 
Al

Reply

Marsh Posté le 19-03-2004 à 18:02:09   

Reply

Marsh Posté le 19-03-2004 à 23:37:59    

Désolé, mais je ne vois pas vraiement de difficulté :??:
 
Toutes les données sont connus, toutes les grandeurs sont calculables, donc y'a juste à pondre le code.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-03-2004 à 02:22:36    

Allez, juste pour le plaisir :
 
http://www.surleau.com/date/date.php
 
Y'a pas les contraintes d'horaires, m'enfin c'est une bonne base je pense.
 
Remarques:
 
1- Je ne garanti rien du tout :D
2- Ca utilise une classe 'oDate' que j'utilise par ailleurs.
3- C'est pas optimisé du tout :ange:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-03-2004 à 10:49:25    

j'arrive un peu en retard, mais moi j'ai fait ça :
 
 

Code :
  1. function dateCheckFree($date)
  2. {
  3. // Dimanche(0) ou Samedi(6)
  4. if(date('w',$date)==0||date('w',$date)==6)
  5. {
  6.  return 1;
  7. }
  8. $jour = date('d',$date);
  9. $mois = date('m',$date);
  10. $annee = date('Y',$date);
  11. if($jour == 1 && $mois == 1) return 1; // 1er janvier
  12. if($jour == 1 && $mois == 5) return 1; // 1er mai
  13. if($jour == 8 && $mois == 5) return 1; // 5 mai
  14. if($jour == 14 && $mois == 7) return 1; // 14 juillet
  15. if($jour == 15 && $mois == 8) return 1; // 15 aout
  16. if($jour == 1 && $mois == 11) return 1; // 1er novembre
  17. if($jour == 11 && $mois == 11) return 1; // 11 novembre
  18. if($jour == 25 && $mois == 12) return 1; // 25 décembre
  19. // Pâques
  20. $date_paques = @easter_date($annee);
  21. $jour_paques = date('d',$date_paques);
  22. $mois_paques = date('m',$date_paques);
  23. if($jour_paques == $jour && $mois_paques == $mois)
  24. {
  25.  return 1;
  26. }
  27. // Ascension
  28. $date_ascension = dateAddDay($date_paques,39);
  29. if(date('d',$date_ascension) == $jour && date('m',$date_ascension) == $mois)
  30. {
  31.  return 1;
  32. }
  33. // Pentecote
  34. $date_pentecote = dateAddDay($date_paques,50);
  35. if(date('d',$date_pentecote) == $jour && date('m',$date_pentecote) == $mois)
  36. {
  37.  return 1;
  38. }
  39. return 0;
  40. };


 
 :sol:

Reply

Marsh Posté le 20-03-2004 à 10:50:35    

c'était pour mon planning en php..

Reply

Marsh Posté le 20-03-2004 à 11:01:31    

Et @easter_date() ca sort d'où ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-03-2004 à 11:04:26    

Reply

Marsh Posté le 20-03-2004 à 11:14:25    

Incroyable !
 
J'avais jamais vu les fonctions de calendrier :ouch:
 
Pourtant la doc PHP, j'ai passé du temps dessus :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 20-03-2004 à 11:16:27    

ben oui c'est magique.. pas besoin de calculer sois meme la date de paque avec un algo de ouf..  :D

Reply

Marsh Posté le 20-03-2004 à 11:21:40    

Yes !
 
Je crois que je vais refaire ma classe oDate !
 
Y'a plein de truc que je calcule moi-même pour rien dedans  :whistle:
 
Edit : Bon, mais ca va pas être pour tout de suite : j'ai piscine !
 
A+, et merci pour l'info :jap:


Message édité par Mara's dad le 20-03-2004 à 11:23:21

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 22-03-2004 à 11:54:03    

Merci à tous pour vos réponses!
J'ai planché dessus ce WE et j'ai finalement réussi avec vos indications. C'était finalement plus impressionnant (pour moi) que difficile! Mon code ressemble à peu près à celui proposé par Mr yvele donc je dois pas être loin de qqch de correct  :D En tout cas, ça a l'air de marcher: cool  :sol:  
 
Encore merci pour votre aide
 
Al

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed