JOURS OUVRES

cs_Silverlink Messages postés 9 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 21 juillet 2006 - 21 juil. 2006 à 12:02
valougraou Messages postés 1 Date d'inscription jeudi 20 janvier 2011 Statut Membre Dernière intervention 20 janvier 2011 - 20 janv. 2011 à 18:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38705-jours-ouvres

valougraou Messages postés 1 Date d'inscription jeudi 20 janvier 2011 Statut Membre Dernière intervention 20 janvier 2011
20 janv. 2011 à 18:49
Bonjour,
Ce sujet est assez ancien, mais je tenais juste à signaler qu'on parle ici de jours ouvrés (considérant le samedi et le dimanche comme jours non travaillés) et non ouvrables.
La définition d'un jour ouvrable est la suivante :
On considère comme ouvrables les jours consacrés au travail, c'est-à-dire tous les jours du calendrier à l'exception des jours correspondant au repos hebdomadaire légal et des jours fériés. En général on considère comme ouvrables les jours du lundi au samedi inclus.
Salutations,
VG
stardust_muss Messages postés 3 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 18 février 2010
18 févr. 2010 à 10:33
à ce jour je n'ai pas réussi à faire marcher le code tel qu'il est fourni.

Voici la version modifié qui fonctionne pour moi

function getNextOpenDay ($iDate, $iDays) {
$aBankHolidays = array (
'1_1',
'1_5',
'8_5',
'14_7',
'15_8',
'1_11',
'11_11',
'25_12'
);

$iEaster = easter_date (date('Y',$iDate));

$aBankHolidays[] = date ('j_n',$iEaster);
$aBankHolidays[] = date ('j_n', $iEaster + (86400*39));
$aBankHolidays[] = date ('j_n', $iEaster + (86400*49));

// stamp théorique de fin
$iEnd = $iDays * 86400;
$i = 0;
while ($i < $iEnd) {
if (in_array(date('w', $iDate+$i),array(0,6)) || in_array(date('j_n', $iDate+$i),$aBankHolidays)) {
$iEnd = strtotime ('+1 day', $iEnd);
}
$i+= 86400;
}

//Stamp de fin date initial + le nombre de décalage
$stampFin = $iDate + $iEnd;
return ($iDate+$iEnd);
}
$iDate = strtotime ('2009-12-24');
$iDays = getNextOpenDay ($iDate, 2);
echo date("d/m/Y",$iDays);

Note : Dans un scénario de congé par exemple
Pour un congé pris le 24 décembre , la fonction retournera 29 décembre (25 férié , 26 27 = samedi et dimanche)
L'employé reviendra bien le 29 mais ses congés prennent fin le 28. Ainsi si on voulait afficher la date de fin de congé on afficherai la date retournée par la fonction - 1 jour.

Cordialement.
Astemius Messages postés 10 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 mars 2010
25 juil. 2008 à 17:16
En fait, la fonction easter_date() ne prend qu'un seul paramètre : l'année.

Voila le easter_date de ton code:
easter_date((int)date('Y'), $iDate)
Si tu suis bien les parenthèses, il y a actuellement l'année et la date que l'on entre en paramètre de la fonction.
Ca ne retourne pas d'erreur (étonnant d'ailleurs), mais ça ne fonctionne pas réellement pour autant. je m'en suis rendu compte en faisant des tests et en constant que cette fonction écrite tel quel me retournait toujours la même date pour pâques, peu importait l'année.

Donc en gros il faut écrire :
easter_date((int)date('Y', $iDate))

Voila, c'est subtile m'enfin.
See you space cowboy...

PS : Franchement, magnifique, après m'être penché un peu dans le code j'ai voulu tenté une chose : les heures ouvrées. Enfin j'en ai besoin pour l'appli en cours, et en gros en mettant 3/24 pour 3h par exemple, et bien ça fonctionne... bref, j'adore (non franchement, si tu savais à quel point j'en chie... j'ai envie de pleurer de joie là ^^)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 juil. 2008 à 20:38
Hello,

merci pour le commentaire :-)
Je ne vois pas de quelle parenthèse mal placée tu parles, par contre ?

Quant à Pâques, j'avoue que je n'avais jamais vérifié...merci pour l'info, je corrigerai.
Astemius Messages postés 10 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 22 mars 2010
24 juil. 2008 à 16:55
Salutations,

j'adore ce genre de code mais, car il y a un mais, y a un soucis au niveau du calcul de pâques et de la pentecôte.
En fait, tu prends bien le jour même de pâques, idem pour la pentecôte. Le soucis est que les jours fériés ont lieu le lendemain, soit le lundi de pâques et le lundi de la pentecôte (l'algo tombe sur les dimanche).

J'ai aussi noté une erreur dans l'utilisation de la fonction easter_date (parenthèse mal placée... d'ailleurs je ne comprends pas pourquoi ça ne me renvoyait pas d'erreur avant). Voici donc le code modifié :

if (function_exists('easter_date')) {
$iEaster = easter_date ((int)date('Y', $iDate));
} else {
$iEaster = getEaster ((int)date('Y'), $iDate);
}
$aBankHolidays[] = date ('j_n',$iEaster + 86400);
$aBankHolidays[] = date ('j_n', $iEaster + (86400*39));
$aBankHolidays[] = date ('j_n', $iEaster + (86400*50));

Pour ma part, j'ai supprimé la fonction getEaster() du code car la fonction easter_date existait effectivement.

M'enfin, merci pour le code, c'est probablement le meilleur que j'ai trouvé. Très optimisé. J'adhère.
cs_FRAJA Messages postés 3 Date d'inscription lundi 21 mars 2005 Statut Membre Dernière intervention 10 avril 2008
10 avril 2008 à 08:43
Bonjour,

j'ai testé à partir de 2008 et pour paques j'ai été obligé d'ajouter + 1.

Pour mon cas j'ai ajouté le samedi dans la semaine.

et pour intégrer paques car ça ne fonctionnait pas (j'ai peut être omis qqchoses mais maintenant ça fonctionne)
$paques=date ('d_m', getEaster (2008));
$paques=str_replace ( '0', '', $paques) ;

et dans la fonction (bien sur ajouter $paque dans l'appel de la fonction)
function getNextOpenDay ($iDate, $iDays,$paques) {
j'ai ajouté
$aBankHolidays[] = $paques;

merci pour ce script qui va rendre service
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 sept. 2006 à 13:44
Hello Philgriadmin,

merci pour l'info, mais à priori, tout ça est déjà correctement implémenté dans mon script. A priori. En tous cas, ça marche très bien en prod chez moi :-) Y compris pour le changement d'heure, maintenant ;-)
philgriadmin Messages postés 6 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 9 février 2007
29 sept. 2006 à 13:11
Salut MALALAM,

tu trouveras tous les renseignements qui tournent autour des jours fériés mobile sur l'excellent site de WIkipédia en cherchant "DATE DE PAQUES"
http://fr.wikipedia.org/wiki/Calcul_de_la_date_de_P%C3%A2ques
Mais pour info :
Pâques est la référence.
Lundi de Pâques est évidement le lendemain
Jeudi de l'Ascension est 39 jours plus tard soit le jeudi de la sixième semaine après Pâques.
Pentecôte est 49 jours plus tard soit le septième dimanche après Pâques
Lundi de Pentecôte est soit le 50eme jour soit le lendemain de la pentecôte à toi de voir ....
Ciao tutti
Sannazzarotiti Messages postés 228 Date d'inscription jeudi 1 septembre 2005 Statut Membre Dernière intervention 12 avril 2009
22 juil. 2006 à 10:47
je savait que tu pouvait les enlever mais pas voir les auteurs des notes ^^. Tout a fait d'accord avec toi. Du mois que l'auteur de la note se justifi. Enfin bref. Ton code pourait m'etre utile dans un de mes futurs projets donc je t'en remerci mais je vais etudier un peu le code car au premier coups d'oeil je comprend pas tout.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 juil. 2006 à 10:08
Ben...lol, ils sont bêtes, parce que : ils ne laissent pas de commentaires en tentant de passer inaperçus sans doute, mais oublient (ou ne savent pas) que je suis admin, et que donc, je sais qui ils sont...bref, je supprime les notes pour les autres dans ce cas, je le fais aussi pour moi, là, y a pas de raison ;-)
Sannazzarotiti Messages postés 228 Date d'inscription jeudi 1 septembre 2005 Statut Membre Dernière intervention 12 avril 2009
22 juil. 2006 à 08:44
j'ai rien a ajouter. super bien coder (comme d'habitude). Par contre je me demande qui a mi 1/20 a la sources...

10/10 ;)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juil. 2006 à 16:45
Jeca => oui, mais easter_date () appartient à une extension qui, elle, n'est pas forcément chargée. Et quand on est chez un hébergeur, sans la main sur le serveur...on ne peut pas toujours l'avoir.

Dans l'article que j'ai lu, je t'assure que l'Ascension était indiquée 38 jours après Pâques (sans autre précision).
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
21 juil. 2006 à 16:23
Il n'y a pas d'erreur dans les articles, car il est toujours dit que l'Ascension se situe 40 jours après Pâques, mais il n'est jamais précisé que Pâques est inclus dans les 40 jours, donc pour un calcul d'interval, c'est 40 - 1 soit 39. Remarque valable aussi pour les autres fêtes mobiles.

D'autre part, je ne pense pas que la fonction de calcul du jour de Pâques soit indispensable car easter_day() fait partie de php depuis la version 3.0.9.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juil. 2006 à 16:16
Moi non plus :-(, mais ça reste férié (chômé) pour beaucoup de boîtes. Donc bon...
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
21 juil. 2006 à 16:14
Pour pentecote, faudrait voir... Il est férié ou pas?
En tout cas, j'y ai pas eu droit...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juil. 2006 à 16:12
Jeca => Pour Pentecôte, j'ai mal lu visiblement, en le foutant 11 jours après Pâques (je n'ai aucune idée de quand c'est, pour être honnête) par contre pour l'Ascension, c'est une erreur sur l'article que j'ai lu dans ce cas. Et une erreur aussi pour Pentecôte, avec aussi 1 jour de décalage.
Maudits articles ;-)
Merci en tous cas, je corrige.
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
21 juil. 2006 à 16:02
Bonjour,

2 bugs :

calcul de l'Ascension :
# $aBankHolidays[] = date ('j_n', $iEaster + (86400*38));
C'est 39 jours après Pâques (40 jours d'après les textes, Pâques inclus) et non 38.

J'imagine que tu as voulu calculer la date de la Pentecôte, et dans ce cas, c'est 49 jours par rapport à Pâques et 10 jours par rapport à l'Ascension.
# $aBankHolidays[] = date ('j_n', $iEaster + (86400*11));
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juil. 2006 à 13:41
"# $iResult = 25-$iC-$iE;
# $iResult;"

T'as fumé ? ;)

=> 'tain, c'est pas ma journée...lol.
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
21 juil. 2006 à 13:38
Tout est bien qui finit bien...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juil. 2006 à 13:34
Ok, là tu as raison, y a un blème, et dans mon calcul de tt à l'heure aussi, ce devrait être le 12 et non pas le 13 :-)
Problème résolu, j'étais parti du fait que le couple jour/mois faisait un entier unique...ce qui est débile : 111 peut correspondre au 1er novembre, comme au 11 janvier.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
21 juil. 2006 à 13:20
"# $iResult = 25-$iC-$iE;
# $iResult;"

T'as fumé ? ;)


Pas mal du tout, ca servira pas pour les sites perso, mais tout ce qui est site marchand devrait être interessé :)
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
21 juil. 2006 à 13:18
hmmm...
4 jours ouvrés après le 6, ca donne le 13 (13-6=7jours)
4 jours ouvrés après le 13, ca donne le 19 (19-13=6jours)
6 et 13 sont 2 vendredis, et il n'y a de jours fériés dans aucune des 2 semaines ;-)
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
21 juil. 2006 à 13:18
Abre los ojos Pada \o/
Désolé grand chef =)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 juil. 2006 à 13:07
PaDa => bah c'est juste un exemple d'utilisation, ça n'a pas de rapport direct avec la fonction :-)

Pastis51Forever => le 6 janvier 2006, c'est un vendredi. Le 7 et le 8 (samedi et dimanche) sont donc non ouvrables (bon, ça c'est dans mon cadre, c'est modifiable facilement). Donc, on tombe au lundi 9. Tu as un delta de 4 jours, donc 9, + 4 jours de delta, on arrive au 13 janvier. C'est bien ce que renvoie ma fonction, et c'est tout à fait juste ;-)
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
21 juil. 2006 à 12:57
Bonjour!

Ca peut être utile, mais un petit détail me chagrine...
Si tu essaies ca:
<?php
$datedepart='2006-01-06';
$delai=4;
$iDate = strtotime ($datedepart);
$iDays = getNextOpenDay ($iDate, $delai);
echo 'Prochain jour ouvrable à partir du '.$datedepart.', après une période de '.$delai.' jours : ', date ('d/m/Y', $iDate + (86400*$iDays)).'
';
$datedepart2='2006-01-13';
$iDate2 = strtotime ($datedepart2);
$iDays2 = getNextOpenDay ($iDate2, $delai);
echo 'Prochain jour ouvrable à partir du '.$datedepart2.', après une période de '.$delai.' jours : ', date ('d/m/Y', $iDate2 + (86400*$iDays2));
?>
Il n'y a pas de jour férié dans aucune des ces 2 periodes, mais la différence de dates n'est pas la meme...

111 est férié, mais pas tout le temps... Il est reconnu pour 1/11, ce qui est bien, mais aussi pour 11/1, qui lui n'est pas férié.
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
21 juil. 2006 à 12:11
Je crois qu'il y a un oops dans ton echo ;)
Tu ne devrais pas mettre $iDays et $iDate au lieu des valeurs fixes en première partie de phrase ?
Bien sinon, ca peut toujours être utile =)
cs_Silverlink Messages postés 9 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 21 juillet 2006
21 juil. 2006 à 12:02
Peut effectivement servir. Le code est court est assez simple donc adaptable.
Rejoignez-nous