par
agité » 03 juil. 2009, 14:36
Tu devrais trouver ton bonheur dans ce code, bien sur c'est plus développer, trouver la date suivante mais pas un week end, pas un jour férié etc avec un report selon les jours +n jours pour le jour suivant de tel ou tel jour.
Mais avec ça ta déjà de quoi faire ce que tu veux.
//Fonction donner heure et jour de levée d'option
function Date_Levee_Option($Date_Enregistree)
{
/* Decoupage de la date */
$Annee_Enregistre_Chiffre = substr($Date_Enregistree, 0, 4);
$Mois_Enregistre_Chiffre = substr($Date_Enregistree, 5, 2);
$Jour_Enregistre_Chiffre = substr($Date_Enregistree, 8, 2);
$Heure_Enregistree = substr($Date_Enregistree, 11, 2);
$Minutes_Enregistree = substr($Date_Enregistree, 14, 2);
$Secondes_Enregistrees = substr($Date_Enregistree, 17, 2);
$Jour_Enregistre = getJour($Date_Enregistree);
$dateAvecOption = finAbonnement($Jour_Enregistre_Chiffre,$Mois_Enregistre_Chiffre,$Annee_Enregistre_Chiffre,ajouterJourOption($Jour_Enregistre));
$explodeDate = explode('-',$dateAvecOption);
$Jour_Enregistre_Chiffre = $explodeDate[2];
$Mois_Enregistre_Chiffre = $explodeDate[1];
$Annee_Enregistre_Chiffre = $explodeDate[0];
// Si jour ferié reporter au lendemain
while(!est1JourOuvrable($Jour_Enregistre_Chiffre, $Mois_Enregistre_Chiffre, $Annee_Enregistre_Chiffre))
{
$dateAvecOption = finAbonnement($Jour_Enregistre_Chiffre,$Mois_Enregistre_Chiffre,$Annee_Enregistre_Chiffre,1);
$explodeDate = explode('-',$dateAvecOption);
$Jour_Enregistre_Chiffre = $explodeDate[2];
$Mois_Enregistre_Chiffre = $explodeDate[1];
$Annee_Enregistre_Chiffre = $explodeDate[0];
// Si la nouvelle date est un week end on reporte au lundi
$nouveauJour = getJour($Annee_Enregistre_Chiffre."-".$Mois_Enregistre_Chiffre."-".$Jour_Enregistre_Chiffre);
if($nouveauJour == 6 || $nouveauJour == 0) $Jour_Enregistre_Chiffre = $Jour_Enregistre_Chiffre + ajouterJourOption($nouveauJour);
}
// Calcul de l'heure mise à jour
$jourFinal = getJour($Annee_Enregistre_Chiffre."-".$Mois_Enregistre_Chiffre."-".$Jour_Enregistre_Chiffre);
if($jourFinal == 1)
{
if($Heure_Enregistree <= 12) {
$Heure = "12:00:00";
}
else {
$Heure = $Heure_Enregistree.":".$Minutes_Enregistree.":".$Secondes_Enregistrees;
}
}
else
{
$Heure = date('H:i:s');
}
((int)$Jour_Enregistre_Chiffre < 10) ? $j = "0".$Jour_Enregistre_Chiffre : $j = $Jour_Enregistre_Chiffre;
((int)$Mois_Enregistre_Chiffre < 10) ? $m = "0".$Mois_Enregistre_Chiffre : $m = $Mois_Enregistre_Chiffre;
return $Date_Enregistrement = $Annee_Enregistre_Chiffre."-".$m."-".$j." ".$Heure;
}
// Calcul de l'ajour du nombre de jour
function ajouterJourOption($jour)
{
switch($jour)
{
case 1:
$Jour_MAJ = 3;
break;
case 2:
$Jour_MAJ = 3;
break;
case 3:
$Jour_MAJ = 5;
break;
case 4:
$Jour_MAJ = 4;
break;
case 5:
$Jour_MAJ = 4;
break;
case 6:
$Jour_MAJ = 2;
break;
case 0:
$Jour_MAJ = 1;
break;
}
return $Jour_MAJ;
}
function getJour($date)
{
$timestamp = strtotime($date);
$jour = date('w',$timestamp);
return $jour;
}
function est1JourOuvrable($jour, $mois, $annee, $alsace=false){
$estFerier = false;
// calcul des jours feries pour un seul mois.
if (mktime(12,0,0,(int)$mois,(int)$jour,(int)$annee) == -1) { return false; }
list($mois, $annee) = explode('-', date('m-Y', mktime(12,0,0,(int)$mois, 1, (int)$annee)));
$annee = intval($annee);
$mois = intval($mois);
// une constante
$jourEnSecondes = 3600*24;
// les jours fixes
$ferie['Jour de l\'An'][1] = 1;
$ferie['Armistice 1939-1945'][5] = 8;
$ferie['Toussaint'][11] = 1;
$ferie['Armistice 1914-1918'][11] = 11;
$ferie['Assomption'][8] = 15;
$ferie['Fête du travail '][5] = 1;
$ferie['Fête nationale française'][7] = 14;
$ferie['Noël'][12] = 25;
// quelques fetes mobiles
$lundi_de_paques['mois'] = date( 'n', easter_date($annee)+1*$jourEnSecondes);
$lundi_de_paques['jour'] = date( 'j', easter_date($annee)+1*$jourEnSecondes);
$lundi_de_paques['nom'] = 'Lundi de Pâques';
$ascencion['mois'] = date( 'n', easter_date($annee)+39*$jourEnSecondes);
$ascencion['jour'] = date( 'j', easter_date($annee)+39*$jourEnSecondes);
$ascencion['nom'] = 'Jeudi de l\'Ascenscion';
/*
$vendredi_saint['mois'] = date( 'n', easter_date($an)-2*$jourEnSecondes);
$vendredi_saint['jour'] = date( 'j', easter_date($an)-2*$jourEnSecondes);
$vendredi_saint['nom'] = 'Vendredi Saint';
*/
$lundi_de_pentecote['mois'] = date( 'n', easter_date($annee)+50*$jourEnSecondes);
$lundi_de_pentecote['jour'] = date( 'j', easter_date($annee)+50*$jourEnSecondes);
$lundi_de_pentecote['nom'] = 'Lundi de Pentecôte';
$ferie[$lundi_de_paques['nom']][$lundi_de_paques['mois']] = $lundi_de_paques['jour'];
$ferie[$lundi_de_pentecote['nom']][$lundi_de_pentecote['mois']] = $lundi_de_pentecote['jour'];
$ferie[$ascencion['nom']][$ascencion['mois']] = $ascencion['jour'];
// if ($alsace) $ferie[$vendredi_saint['nom'].' (Alsace)'][$vendredi_saint['mois']]= $vendredi_saint['jour'];
// reponse
while( list($nom, $date)=each($ferie) ){
if ( $date[$mois]==$jour ){
$estFerier = true;
}
}
//test jour ouvrable oui/non
return !( $estFerier );
}
function dateSuivante($jour, $mois, $annee, $sep='/')
{
$jour = (int)$jour;
$mois = (int)$mois;
$annee = (int)$annee;
if(!checkdate($mois,$jour,$annee)) return false;
if(checkdate($mois,($jour+1),$annee)) return ($jour+1).$sep.$mois.$sep.$annee;
if(checkdate($mois+1,1,$annee)) return '1'.$sep.($mois+1).$sep.$annee;
if(checkdate(1,1,$annee+1)) return '1'.$sep.'1'.$sep.($annee+1);
}
function finAbonnement($jourDeb, $moisDeb, $anneeDeb, $nbJours)
{
if(!checkdate($moisDeb, $jourDeb, $anneeDeb)) return false;
$jourFinAbo = $jourDeb;
$moisFinAbo = $moisDeb;
$anneeFinAbo = $anneeDeb;
for($i=1; $i<=$nbJours; $i++){
$dateS = dateSuivante($jourFinAbo,$moisFinAbo,$anneeFinAbo);
$tmp = explode('/', $dateS);
$jourFinAbo = $tmp[0];
$moisFinAbo = $tmp[1];
$anneeFinAbo = $tmp[2];
}
return $anneeFinAbo.'-'.$moisFinAbo.'-'.$jourFinAbo;
}
Tu devrais trouver ton bonheur dans ce code, bien sur c'est plus développer, trouver la date suivante mais pas un week end, pas un jour férié etc avec un report selon les jours +n jours pour le jour suivant de tel ou tel jour.
Mais avec ça ta déjà de quoi faire ce que tu veux.
[php]
//Fonction donner heure et jour de levée d'option
function Date_Levee_Option($Date_Enregistree)
{
/* Decoupage de la date */
$Annee_Enregistre_Chiffre = substr($Date_Enregistree, 0, 4);
$Mois_Enregistre_Chiffre = substr($Date_Enregistree, 5, 2);
$Jour_Enregistre_Chiffre = substr($Date_Enregistree, 8, 2);
$Heure_Enregistree = substr($Date_Enregistree, 11, 2);
$Minutes_Enregistree = substr($Date_Enregistree, 14, 2);
$Secondes_Enregistrees = substr($Date_Enregistree, 17, 2);
$Jour_Enregistre = getJour($Date_Enregistree);
$dateAvecOption = finAbonnement($Jour_Enregistre_Chiffre,$Mois_Enregistre_Chiffre,$Annee_Enregistre_Chiffre,ajouterJourOption($Jour_Enregistre));
$explodeDate = explode('-',$dateAvecOption);
$Jour_Enregistre_Chiffre = $explodeDate[2];
$Mois_Enregistre_Chiffre = $explodeDate[1];
$Annee_Enregistre_Chiffre = $explodeDate[0];
// Si jour ferié reporter au lendemain
while(!est1JourOuvrable($Jour_Enregistre_Chiffre, $Mois_Enregistre_Chiffre, $Annee_Enregistre_Chiffre))
{
$dateAvecOption = finAbonnement($Jour_Enregistre_Chiffre,$Mois_Enregistre_Chiffre,$Annee_Enregistre_Chiffre,1);
$explodeDate = explode('-',$dateAvecOption);
$Jour_Enregistre_Chiffre = $explodeDate[2];
$Mois_Enregistre_Chiffre = $explodeDate[1];
$Annee_Enregistre_Chiffre = $explodeDate[0];
// Si la nouvelle date est un week end on reporte au lundi
$nouveauJour = getJour($Annee_Enregistre_Chiffre."-".$Mois_Enregistre_Chiffre."-".$Jour_Enregistre_Chiffre);
if($nouveauJour == 6 || $nouveauJour == 0) $Jour_Enregistre_Chiffre = $Jour_Enregistre_Chiffre + ajouterJourOption($nouveauJour);
}
// Calcul de l'heure mise à jour
$jourFinal = getJour($Annee_Enregistre_Chiffre."-".$Mois_Enregistre_Chiffre."-".$Jour_Enregistre_Chiffre);
if($jourFinal == 1)
{
if($Heure_Enregistree <= 12) {
$Heure = "12:00:00";
}
else {
$Heure = $Heure_Enregistree.":".$Minutes_Enregistree.":".$Secondes_Enregistrees;
}
}
else
{
$Heure = date('H:i:s');
}
((int)$Jour_Enregistre_Chiffre < 10) ? $j = "0".$Jour_Enregistre_Chiffre : $j = $Jour_Enregistre_Chiffre;
((int)$Mois_Enregistre_Chiffre < 10) ? $m = "0".$Mois_Enregistre_Chiffre : $m = $Mois_Enregistre_Chiffre;
return $Date_Enregistrement = $Annee_Enregistre_Chiffre."-".$m."-".$j." ".$Heure;
}
// Calcul de l'ajour du nombre de jour
function ajouterJourOption($jour)
{
switch($jour)
{
case 1:
$Jour_MAJ = 3;
break;
case 2:
$Jour_MAJ = 3;
break;
case 3:
$Jour_MAJ = 5;
break;
case 4:
$Jour_MAJ = 4;
break;
case 5:
$Jour_MAJ = 4;
break;
case 6:
$Jour_MAJ = 2;
break;
case 0:
$Jour_MAJ = 1;
break;
}
return $Jour_MAJ;
}
function getJour($date)
{
$timestamp = strtotime($date);
$jour = date('w',$timestamp);
return $jour;
}
function est1JourOuvrable($jour, $mois, $annee, $alsace=false){
$estFerier = false;
// calcul des jours feries pour un seul mois.
if (mktime(12,0,0,(int)$mois,(int)$jour,(int)$annee) == -1) { return false; }
list($mois, $annee) = explode('-', date('m-Y', mktime(12,0,0,(int)$mois, 1, (int)$annee)));
$annee = intval($annee);
$mois = intval($mois);
// une constante
$jourEnSecondes = 3600*24;
// les jours fixes
$ferie['Jour de l\'An'][1] = 1;
$ferie['Armistice 1939-1945'][5] = 8;
$ferie['Toussaint'][11] = 1;
$ferie['Armistice 1914-1918'][11] = 11;
$ferie['Assomption'][8] = 15;
$ferie['Fête du travail '][5] = 1;
$ferie['Fête nationale française'][7] = 14;
$ferie['Noël'][12] = 25;
// quelques fetes mobiles
$lundi_de_paques['mois'] = date( 'n', easter_date($annee)+1*$jourEnSecondes);
$lundi_de_paques['jour'] = date( 'j', easter_date($annee)+1*$jourEnSecondes);
$lundi_de_paques['nom'] = 'Lundi de Pâques';
$ascencion['mois'] = date( 'n', easter_date($annee)+39*$jourEnSecondes);
$ascencion['jour'] = date( 'j', easter_date($annee)+39*$jourEnSecondes);
$ascencion['nom'] = 'Jeudi de l\'Ascenscion';
/*
$vendredi_saint['mois'] = date( 'n', easter_date($an)-2*$jourEnSecondes);
$vendredi_saint['jour'] = date( 'j', easter_date($an)-2*$jourEnSecondes);
$vendredi_saint['nom'] = 'Vendredi Saint';
*/
$lundi_de_pentecote['mois'] = date( 'n', easter_date($annee)+50*$jourEnSecondes);
$lundi_de_pentecote['jour'] = date( 'j', easter_date($annee)+50*$jourEnSecondes);
$lundi_de_pentecote['nom'] = 'Lundi de Pentecôte';
$ferie[$lundi_de_paques['nom']][$lundi_de_paques['mois']] = $lundi_de_paques['jour'];
$ferie[$lundi_de_pentecote['nom']][$lundi_de_pentecote['mois']] = $lundi_de_pentecote['jour'];
$ferie[$ascencion['nom']][$ascencion['mois']] = $ascencion['jour'];
// if ($alsace) $ferie[$vendredi_saint['nom'].' (Alsace)'][$vendredi_saint['mois']]= $vendredi_saint['jour'];
// reponse
while( list($nom, $date)=each($ferie) ){
if ( $date[$mois]==$jour ){
$estFerier = true;
}
}
//test jour ouvrable oui/non
return !( $estFerier );
}
function dateSuivante($jour, $mois, $annee, $sep='/')
{
$jour = (int)$jour;
$mois = (int)$mois;
$annee = (int)$annee;
if(!checkdate($mois,$jour,$annee)) return false;
if(checkdate($mois,($jour+1),$annee)) return ($jour+1).$sep.$mois.$sep.$annee;
if(checkdate($mois+1,1,$annee)) return '1'.$sep.($mois+1).$sep.$annee;
if(checkdate(1,1,$annee+1)) return '1'.$sep.'1'.$sep.($annee+1);
}
function finAbonnement($jourDeb, $moisDeb, $anneeDeb, $nbJours)
{
if(!checkdate($moisDeb, $jourDeb, $anneeDeb)) return false;
$jourFinAbo = $jourDeb;
$moisFinAbo = $moisDeb;
$anneeFinAbo = $anneeDeb;
for($i=1; $i<=$nbJours; $i++){
$dateS = dateSuivante($jourFinAbo,$moisFinAbo,$anneeFinAbo);
$tmp = explode('/', $dateS);
$jourFinAbo = $tmp[0];
$moisFinAbo = $tmp[1];
$anneeFinAbo = $tmp[2];
}
return $anneeFinAbo.'-'.$moisFinAbo.'-'.$jourFinAbo;
}
[/php]