Discussion:
nombre de jour ouvre dans un mois
(trop ancien pour répondre)
jeremie fouche
2007-01-17 22:18:06 UTC
Permalink
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
Olivier Miakinen
2007-01-18 00:07:28 UTC
Permalink
Post by 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>

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.
Olivier Miakinen
2007-01-18 00:31:08 UTC
Permalink
Post by Olivier Miakinen
$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).
jeremie fouche
2007-01-19 20:03:52 UTC
Permalink
Post by Olivier Miakinen
$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
t***@gmail.com
2007-01-20 13:41:40 UTC
Permalink
Post by jeremie fouche
Post by Olivier Miakinen
$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
Bonjour,

J'ai fait quelque chose du genre :

<?php

function jours_ouvres() {

$date = array();

$date['annee'] = date('Y');
$date['mois'] = date('m');

$n = 0;

for ( $i = 1; $i <= date('t'); $i++ ) {

$date['jour'] = date('D', mktime(0, 0, 0, $date['mois'], $i,
$date['annee']));
if ( $date['jour'] != 'Sun' AND $date['jour'] != 'Sat' ) $n++;
}

return $n;
}

echo '<strong>Nombre de jours ouvrés : </strong>'.jours_ouvres();
?>

Seulement, ce script retourne le nombre de jours ouvrés du mois 'en
cours', je ne vois pas trop comment le déplacer sur les autres mois
(je n'y ai pas vraiment réfléchi ;) )
J'espere que ça pourra servir :)
jeremie fouche
2007-01-19 18:17:02 UTC
Permalink
Post by Olivier Miakinen
Post by 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
Olivier Miakinen
2007-01-21 08:37:16 UTC
Permalink
Post by jeremie fouche
Post by 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.

- = Cyriloch = -
2007-01-18 22:48:16 UTC
Permalink
Post by 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
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;
Continuer la lecture sur narkive:
Loading...