begin process at 2008 05 17 13:22:05
1 174 021 membres
141 nouveaux aujourd'hui
13 974 membres club

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 : 16 986

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (22)
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
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
  • 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

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS