Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

nombre de jour ouvre dans un mois

6 réponses
Avatar
jeremie fouche
Bonjour

Je recherche un script qui calcul le nombre de jours ouvrés dans un
mois, ie : du lundi au vendredi.

avec date('t', $date) et date('w', $date) j'ai pas mal d'infos, mais a
part incrémenter sur le jour jusqu'au dernier, je ne vois pas trop
l'algo simple, en une passe a mettre en place.
Si vous avez des idées, je suis preneur
Merci
--
Jérémie

6 réponses

Avatar
Olivier Miakinen

Je recherche un script qui calcul le nombre de jours ouvrés dans un
mois, ie : du lundi au vendredi.

avec date('t', $date) et date('w', $date) j'ai pas mal d'infos, mais a
part incrémenter sur le jour jusqu'au dernier, je ne vois pas trop
l'algo simple, en une passe a mettre en place.
Si vous avez des idées, je suis preneur


Bon, je réponds et je réfléchis en même temps, du coup pardon si ma
réponse n'est pas très structurée.

Tout d'abord, la fonction date() qui gère aussi l'heure n'est pas très
adaptée pour des calculs de calendrier : tu risques toujours de tomber
sur un bug de ton script dû au timezone (fuseau horaire) ou au passage à
l'heure d'été ou l'heure d'hiver. Le mieux est d'utiliser les fonctions
de calendrier : <http://fr3.php.net/calendar>

Déjà, tu peux commencer par demander combien il y a de jours dans ton
mois, avec la fonction cal_days_in_month(). Si la réponse est 28, c'est
qu'il y a exactement 4 semaines, donc 20 jours ouvrés. Sinon, les seuls
jours qui t'intéressent sont les (cal_days_in_month()-28) qui restent à
partir du 29 du mois, et tu as besoin de connaître le premier de ces
jours, à savoir : jddayofweek(gregoriantojd(mois, 29, année)).

Bien. On a donc :
$nb_after_28 = cal_days_in_month(CAL_GREGORIAN, $month, $year) - 28;
$day_for_29 = jddayofweek(gregoriantojd($month, 29, $year));
$jours_ouvrés = 20 + <quelque chose à déterminer>;

Le <quelque chose à déterminer> dépend de $nb_after_28 (entre 0 et 3)
et de $day_for_29 (entre 0 et 6). Il est assez facile à déterminer
pour tous les cas (22 cas au maximum mais on doit pouvoir factoriser
les calculs). Bon, je me fais un petit tableau et je reviens.

Avatar
Olivier Miakinen

Bien. On a donc :
$nb_after_28 = cal_days_in_month(CAL_GREGORIAN, $month, $year) - 28;
$day_for_29 = jddayofweek(gregoriantojd($month, 29, $year));
$jours_ouvrés = 20 + <quelque chose à déterminer>;

Le <quelque chose à déterminer> dépend de $nb_after_28 (entre 0 et 3)
et de $day_for_29 (entre 0 et 6). Il est assez facile à déterminer
pour tous les cas (22 cas au maximum mais on doit pouvoir factoriser
les calculs). Bon, je me fais un petit tableau et je reviens.


Bon, j'ai la flemme de vérifier, ou de traiter ça de façon plus
intelligente, mais ceci devrait marcher :

$delta = array(
array(0,0,0,0,0,0,0),
array(0,1,1,1,1,1,0),
array(1,2,2,2,2,1,0),
array(2,3,3,3,2,1,1)
);
$jours_ouvrés = 20 + $delta[$nb_after_28][$day_for_29];

Tu peux même inclure le 20 dans chaque case du tableau. Bonne chance !
(ne pas oublier de tester tous les cas).

Avatar
- = Cyriloch = -
Bonjour

Je recherche un script qui calcul le nombre de jours ouvrés dans un
mois, ie : du lundi au vendredi.

avec date('t', $date) et date('w', $date) j'ai pas mal d'infos, mais a
part incrémenter sur le jour jusqu'au dernier, je ne vois pas trop
l'algo simple, en une passe a mettre en place.
Si vous avez des idées, je suis preneur
Merci


Bonsoir,
Ca ne répond pas totalement à la question, mais au cas où ça puisse
servir... Pour un problème un peu similaire (calcul d'une prévision de
chiffre d'affaires mensuel en fonction du chiffre d'affaires des jours
passés), j'ai écrit ceci, qui fonctionne assez bien.
Cordialement,


$Annee = date('Y');

// Construit un tableau contenant les jours fériés de l'année en cours

$PaquesDim = easter_date($Annee);
$PaquesLun = date('Y-m-d', ($PaquesDim + 24*3600));
$PentecoteLun = date('Y-m-d', ($PaquesDim + 50*24*3600));
$AscensionJeu = date('Y-m-d', ($PaquesDim + 39*24*3600));

$JoursFeries = array("$An-01-01", "$An-05-01", "$An-05-08", "$An-07-14",
"$An-08-15", "$An-11-01", "$An-11-11", "$An-12-25", "$PaquesLun",
"$AscensionJeu", "$PentecoteLun");

// Calcul du nombre de jours ouvrés

$NbJours = date('t');
$Mois = date('m');
$Jour = date('d');

$Maintenant = mktime(0,0,0, $Mois, $Jour, $Annee);

$JoursTravaillesPasses = 0;
$JoursTravaillesFuturs = 0;

for($i=1; $i<=$NbJours; $i++) {

$DateJour = mktime(0, 0, 0, $Mois, $i, $Annee);
$JourSemaine = date('D', $DateJour);
if(!in_array($DateJour, $JoursFeries) && $JourSemaine != 'Sun' &&
$JourSemaine != 'Sat' ) {
if($DateJour <= $Maintenant) {
$JoursTravaillesPasses++;
} else {
$JoursTravaillesFuturs++;
}
}
}

$JoursTravaillesMois = $JoursTravaillesPasses + $JoursTravaillesFuturs;

Avatar
jeremie fouche
Je recherche un script qui calcul le nombre de jours ouvrés dans un
mois, ie : du lundi au vendredi.

avec date('t', $date) et date('w', $date) j'ai pas mal d'infos, mais a
part incrémenter sur le jour jusqu'au dernier, je ne vois pas trop
l'algo simple, en une passe a mettre en place.
Si vous avez des idées, je suis preneur


Bon, je réponds et je réfléchis en même temps, du coup pardon si ma
réponse n'est pas très structurée.

Tout d'abord, la fonction date() qui gère aussi l'heure n'est pas très
adaptée pour des calculs de calendrier : tu risques toujours de tomber
sur un bug de ton script dû au timezone (fuseau horaire) ou au passage à
l'heure d'été ou l'heure d'hiver. Le mieux est d'utiliser les fonctions
de calendrier : <http://fr3.php.net/calendar>

...


Merci beaucoup, je regarde ça, et je teste votre solution. Je vous avoue
que ca ne m'arrange des masses ce que vous m'annoncez, car je me suis
créé une biblioteques de fonctions sur les dates basé sur date(). Je
n'ai pas eu de problèmes (visibles) encore.
--
Jérémie


Avatar
jeremie fouche
$nb_after_28 = cal_days_in_month(CAL_GREGORIAN, $month, $year) - 28;
$day_for_29 = jddayofweek(gregoriantojd($month, 29, $year));
$delta = array(
array(0,0,0,0,0,0,0),
array(0,1,1,1,1,1,0),
array(1,2,2,2,2,1,0),
array(2,3,3,3,2,1,1)
);
$jours_ouvrés = 20 + $delta[$nb_after_28][$day_for_29];


Ca a l'air de fonctionner correctement.
Merci beaucoup
--
Jérémie

Avatar
Olivier Miakinen

Tout d'abord, la fonction date() qui gère aussi l'heure n'est pas très
adaptée pour des calculs de calendrier : tu risques toujours de tomber
sur un bug de ton script dû au timezone (fuseau horaire) ou au passage à
l'heure d'été ou l'heure d'hiver. Le mieux est d'utiliser les fonctions
de calendrier : <http://fr3.php.net/calendar>


Merci beaucoup, je regarde ça, et je teste votre solution. Je vous avoue
que ca ne m'arrange des masses ce que vous m'annoncez, car je me suis
créé une biblioteques de fonctions sur les dates basé sur date(). Je
n'ai pas eu de problèmes (visibles) encore.


Bon, si tu es en France et que tous tes calculs de date se font bien
à l'heure 00:00 il ne devrait pas y avoir de problème puisque le
changement d'heure se fait à 01:00 UTC, soit entre 02:00 et 03:00
en heure locale française. Mais il ne faudrait pas par exemple faire
des calculs en fixant le jour mais en laissant l'heure du moment. Ou
bien faire tourner le serveur dans un fuseau horaire à -0100 en heure
d'été ou d'hiver.