Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

JOURS OUVRES


Information sur la source

Catégorie :Date / Heure Classé sous : jours, fériés, ouvrables, date, calendrier Niveau : Débutant Date de création : 21/07/2006 Date de mise à jour : 28/09/2006 12:07:38 Vu : 23 376

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

Description

Bon, une petite fonction toute simple, mais qui peut être un life saver!
Trouve le prochain jour ouvrable, en fonction d'une date et d'un delta en jours.
Par exemple, on passe une commande le 12 juillet 2006, l'envoi dure 2 jours. getNextOpenDay va renvoyer 5 jours, on recevra donc notre commande le 17, car 2 jours après le 12 juille, c'est le 14 (férié), qui est un vendredi. Samedi et dimanche sont non ouvrables, on arrive donc au lundi 7.

getNextOpenDay ($iDate, $iDays) :
$iDate = timestamp de la date
$iDays = nombre de jours de delta
 

Source

  • <?php
  • function getEaster ($iYear = null) {
  • if (is_null ($iYear)) {
  • $iYear = (int)date ('Y');
  • }
  • $iN = $iYear - 1900;
  • $iA = $iN%19;
  • $iB = floor (((7*$iA)+1)/19);
  • $iC = ((11*$iA)-$iB+4)%29;
  • $iD = floor ($iN/4);
  • $iE = ($iN-$iC+$iD+31)%7;
  • $iResult = 25-$iC-$iE;
  • if ($iResult > 0) {
  • $iEaster = strtotime ($iYear.'/04/'.$iResult);
  • } else {
  • $iEaster = strtotime ($iYear.'/03/'.(31+$iResult));
  • }
  • return $iEaster;
  • }
  • echo 'Paques : ', date ('d-m-Y', getEaster (2006));
  • echo '<br />';
  • function getNextOpenDay ($iDate, $iDays) {
  • $aBankHolidays = array (
  • '1_1',
  • '1_5',
  • '8_5',
  • '14_7',
  • '15_8',
  • '1_11',
  • '11_11',
  • '25_12'
  • );
  • if (function_exists ('easter_date')) {
  • $iEaster = easter_date ((int)date('Y'), $iDate);
  • } else {
  • $iEaster = getEaster ((int)date('Y'), $iDate);
  • }
  • $aBankHolidays[] = date ('j_n',$iEaster);
  • $aBankHolidays[] = date ('j_n', $iEaster + (86400*39));
  • $aBankHolidays[] = date ('j_n', $iEaster + (86400*49));
  • print_r ($aBankHolidays);
  • $iEnd = $iDays * 86400;
  • $i = 0;
  • while ($i < $iEnd) {
  • $i = strtotime ('+1 day', $i);
  • if (in_array (date ('w', $iDate+$i),array (0,6) ) || in_array (date ('j_n', $iDate+$i), $aBankHolidays)) {
  • $iEnd = strtotime ('+1 day', $iEnd);
  • $iDays ++;
  • }
  • }
  • return $iDays;
  • }
  • $iDate = strtotime ('2006-06-30');
  • $iDays = getNextOpenDay ($iDate, 2);
  • echo 'Prochain jour ouvrable à partir du 30/06/2006, avec un delta de 2 jours : ', date ('d/m/Y', $iDate + (86400*$iDays));
  • ?>
<?php
function getEaster ($iYear = null) {
	if (is_null ($iYear)) {
		$iYear = (int)date ('Y');
	}
	$iN = $iYear - 1900;
	$iA = $iN%19;
	$iB = floor (((7*$iA)+1)/19);
	$iC = ((11*$iA)-$iB+4)%29;
	$iD = floor ($iN/4);
	$iE = ($iN-$iC+$iD+31)%7;
	$iResult = 25-$iC-$iE;
	if ($iResult > 0) {
		$iEaster = strtotime ($iYear.'/04/'.$iResult);
	} else {
		$iEaster = strtotime ($iYear.'/03/'.(31+$iResult));
	}
	return $iEaster;
}

echo 'Paques : ', date ('d-m-Y', getEaster (2006));
echo '<br />';

function getNextOpenDay ($iDate, $iDays) {
	$aBankHolidays = array (
		'1_1',
		'1_5',
		'8_5',
		'14_7',
		'15_8',
		'1_11',
		'11_11',
		'25_12'
		);
	if (function_exists ('easter_date')) {
		$iEaster = easter_date ((int)date('Y'), $iDate);
	} else {
		$iEaster = getEaster ((int)date('Y'), $iDate);
	}
	$aBankHolidays[] = date ('j_n',$iEaster);
	$aBankHolidays[] = date ('j_n', $iEaster + (86400*39));
	$aBankHolidays[] = date ('j_n', $iEaster + (86400*49));
	print_r ($aBankHolidays);
	$iEnd = $iDays * 86400;
	$i = 0;
	while ($i < $iEnd) {
		$i = strtotime ('+1 day', $i);
		if (in_array (date ('w', $iDate+$i),array (0,6) ) || in_array (date ('j_n', $iDate+$i), $aBankHolidays)) {
			$iEnd = strtotime ('+1 day', $iEnd);
			$iDays ++;
		}
	}
	return $iDays;
}

$iDate = strtotime ('2006-06-30');
$iDays = getNextOpenDay ($iDate, 2);
echo 'Prochain jour ouvrable à partir du 30/06/2006, avec un delta de 2 jours : ', date ('d/m/Y', $iDate + (86400*$iDays));
?>

Conclusion

Dispo aussi sur Codyx :
http://www.codyx.org/snippet_trouver-prochain-jour-ouvrable-partir-date-selon-delta_183.aspx#591
 

Historique

21 juillet 2006 12:02:30 :
Petit oubli sur les jours variables ;-)
21 juillet 2006 12:58:57 :
Ajout du calcul de la date de Pâques si jamais easter_date () n'est pas disponible.
21 juillet 2006 13:01:05 :
Encore un oubli, grr
21 juillet 2006 13:33:20 :
Bug fix
21 juillet 2006 13:38:31 :
et encore un oubli, un... ;-)
21 juillet 2006 13:40:40 :
c'est pas ma journée...
21 juillet 2006 16:14:12 :
Bug fix sur les dates de l'Ascension et de Pentecôte (merci Jeca).
28 septembre 2006 12:07:39 :
Prise en compte du changement d'heure

Commentaires et avis

signaler à un administrateur
Commentaire de Silverlink le 21/07/2006 12:02:15

Peut effectivement servir. Le code est court est assez simple donc adaptable.

signaler à un administrateur
Commentaire de PaDa le 21/07/2006 12:11:51

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 =)

signaler à un administrateur
Commentaire de pastis51forever le 21/07/2006 12:57:26

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)).'<br />';
$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é.

signaler à un administrateur
Commentaire de malalam le 21/07/2006 13:07:31 administrateur CS

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 ;-)

signaler à un administrateur
Commentaire de PaDa le 21/07/2006 13:18:13

Abre los ojos Pada \o/
Désolé grand chef =)

signaler à un administrateur
Commentaire de pastis51forever le 21/07/2006 13:18:29

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 ;-)

signaler à un administrateur
Commentaire de FhX le 21/07/2006 13:20:43

"#     $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é :)

signaler à un administrateur
Commentaire de malalam le 21/07/2006 13:34:44 administrateur CS

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.

signaler à un administrateur
Commentaire de pastis51forever le 21/07/2006 13:38:58

Tout est bien qui finit bien...

signaler à un administrateur
Commentaire de malalam le 21/07/2006 13:41:46 administrateur CS

"#     $iResult = 25-$iC-$iE;
#     $iResult;"

T'as fumé ? ;)

=> 'tain, c'est pas ma journée...lol.

signaler à un administrateur
Commentaire de jeca le 21/07/2006 16:02:47

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));

signaler à un administrateur
Commentaire de malalam le 21/07/2006 16:12:14 administrateur CS

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.

signaler à un administrateur
Commentaire de pastis51forever le 21/07/2006 16:14:05

Pour pentecote, faudrait voir... Il est férié ou pas?
En tout cas, j'y ai pas eu droit...

signaler à un administrateur
Commentaire de malalam le 21/07/2006 16:16:30 administrateur CS

Moi non plus :-(, mais ça reste férié (chômé) pour beaucoup de boîtes. Donc bon...

signaler à un administrateur
Commentaire de jeca le 21/07/2006 16:23:34

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.

signaler à un administrateur
Commentaire de malalam le 21/07/2006 16:45:41 administrateur CS

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).

signaler à un administrateur
Commentaire de Sannazzarotiti le 22/07/2006 08:44:52

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 ;)

signaler à un administrateur
Commentaire de malalam le 22/07/2006 10:08:21 administrateur CS

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 ;-)

signaler à un administrateur
Commentaire de Sannazzarotiti le 22/07/2006 10:47:32

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.

signaler à un administrateur
Commentaire de philgriadmin le 29/09/2006 13:11:49

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

signaler à un administrateur
Commentaire de malalam le 29/09/2006 13:44:24 administrateur CS

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 ;-)

signaler à un administrateur
Commentaire de FRAJA le 10/04/2008 08:43:07

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

signaler à un administrateur
Commentaire de Astemius le 24/07/2008 16:55:36 9/10

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.

signaler à un administrateur
Commentaire de malalam le 24/07/2008 20:38:40 administrateur CS

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.

signaler à un administrateur
Commentaire de Astemius le 25/07/2008 17:16:54

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à ^^)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

comparer une date saisie avec une date mysql [ par cLilie ] Salut,je cherche comment comparer une date saisie au clavier dans une zone de texte et une date provenant de mysql.et aussi j'aimerais pouvoir ajouter ajouter des jours à une date? [ par cedd ] Bonjour!Petit problème: je récupère une chaine de caractères qui est une date, de la forme 23/03/2004(enfin, je peux la mettre autrement si besoin es Nombres de jours entre 2 dates! [ par jimmy69 ] Bonjour a tous,Voila j'ai un p'tit stress ....si quelqu'un pouvait m'aider!En fait j'enregistre mes donnees ds une table mysql , des donnees comme le requette si posssible [ par youyou26 ] bonjour tt le monde je suis un peu despérer j'ai petit calendrier et un fichier ¤.gif et chaque image et enregistré avec une date ce quie j'ai envie c problemes de lien dans un calendrier [ par hysteria74000 ] qulequ'un peut me dire pourquoi mes liens, dans mon calendrier, SUIVANT et PRECEDENT ne fonctionnent pas.Voici le code php::$lien=date("Y+m+d", mktime PHP probleme de boucle avec dates [ par infosub ] Bonjour, je suis confront&#233; &#224; un petit probl&#232;me de boucle pour ajouter plusieurs jour &#224; une date.. le script ci-dessous calcule le Je trouve pas l'erreur sur mon script [ par Akash ] Salut à tous j'espère que vous pourrez m'aider. Voila le problème :Pour mon script de calendrier evenementiel j'ai besoin d'afficher des évènements pa date dans un tableau [ par titigrou ] kikou!!!j'ai une liste déroulante semaine créée a partir des données de la baseet j'ai un tableau avec les joursje voudrais savoir comment on fait, un Retrouver la date d'il y'a X jours [ par Inekman ] Salut les amis,Je galère un peu pour retrouver une date à partir d'aujourd'hui d'il y'a X jours...:'(J'ai trouvé pas mal de code qui calcul l'écart en calculer DATE - 7 jours [ par michelvernet2 ] salut,comment faire simple pour calculer la date - 7 jours ?du genre ( imaginons y=05 m=01 et d=05)&nbsp; date(ymd) - 7 jours devrait donner : 041229q


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.