begin process at 2012 02 05 00:14:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > JOURS OUVRES

JOURS OUVRES


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :30 384

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (27)
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-jo ur-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

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

Source avec une capture AGENDA GRAPHIQUE SIMPLE (DÉBUTANT) À INTÉGRER par NicomakM
CALCUL DU NOMBRE DE JOURS CONTENUS DANS L'INTERSECTION DE DE... par curphey
CALENDRIER EN 70 LIGNES par tchconst
Source avec Zip CALENDRIER par gabay
CALENDRIER SIMPLE par manuche

 Sources en rapport avec celle ci

CALENDRIER SIMPLE par manuche
DIFFÉRENCE ENTRE DEUX DATE EN JOURS (LISTE RÉCUPÉRÉE DANS UN... par DevilTN
Source avec Zip Source avec une capture CALENDRIER + AGENDA TRÈS SIMPLE (GERER LES JOURS FÉRIÉS ET L... par mondherclubiste
Source avec Zip Source avec une capture CALENDRIER par pichpoich
CALCUL SIMPLE DU NOMBRE DE JOURS OUVRÉS ENTRE DEUX DATES (JO... par Astemius

Commentaires et avis

Commentaire de Silverlink le 21/07/2006 12:02:15

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

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

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

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

Commentaire de PaDa le 21/07/2006 13:18:13

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

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

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é :)

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.

Commentaire de pastis51forever le 21/07/2006 13:38:58

Tout est bien qui finit bien...

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.

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

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.

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

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

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.

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

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

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

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.

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

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

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

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.

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.

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

Commentaire de stardust_muss le 18/02/2010 10:33:25

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

Commentaire de valougraou le 20/01/2011 18:49:21

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

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

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales