Ajouter un délai à une date en tenant compte des heures ouvrées
red2
Messages postés6Date d'inscriptionmardi 29 mai 2007StatutMembreDernière intervention30 mai 2007
-
30 mai 2007 à 13:44
J_G
Messages postés1406Date d'inscriptionmercredi 17 août 2005StatutMembreDernière intervention28 août 2007
-
30 mai 2007 à 17:18
Bonjour,
j'ai un problème avec le calcul d'une date, car je dois ajouter un délai à une date en prenant compte les heures ouvrées.
Pour cela j'essaye de faire une fonction qui prendrait comme argument:
Délai = > durée en seconde (que je récupère dans une base de données)
Date => ça sera la date-heure du jour (getdate() de la base)
Variables: pour les heures ouvrées
Jours de la semaine (du lundi au vendredi)
$ho_m_LV = 08:15 = > heure d'ouverture le matin du lundi au vendredi$hf_m_LV 12:00> heure de fermeture le matin du lundi au vendredi
$ho_ap_LV = 13:00 => heure d'ouverture l'apres-midi du lundi au vendredi$hf_ap_LV 18:00> heure de fermeture l'apres-midi du lundi au vendredi
Samedi :$ho_m_S 08:15> heure d'ouverture le matin le samedi$hf_m_S 12:30> heure de fermeture le matin le samedi$ho_ap_S 13:15> heure d'ouverture l'apres-midi le samedi
$hf_ap_S = 16:30 => heure de fermeture l'apres-midi le samedi
Dimanche :Fermé
Et elle retournerai:
Date => date-heure qui sera forcément dans les heure d'ouverture
AIDEZ MOI SVP !!!
Alors s'il y a des personnes qui peuvent me donner des pistes, ça serait sympa.
J_G
Messages postés1406Date d'inscriptionmercredi 17 août 2005StatutMembreDernière intervention28 août 200710 30 mai 2007 à 14:31
Salut,
En fin de compte, il faut que tu augmente ton délai de la durée des périodes non-ouvrées, pour trouver sa "vraie" durée.
Je te propose ce genre d'algorithme... certainement pas le meilleur :
Note : PNO = "période non-ouvrée"
-----------------
$date = // début du délai
$delai = // durée du delai, paramêtre donnée à ta fonction
$t = $date; // variable qui va parcourir le temps !
// Heuresement, on sait que $date tombe dans un période ouvrée...
do { // on cherche au moins une fois une PNO dans le delai
$pno_date = debut_de_la_prochaine_PNO( $t ); // donc calculé par rapport à $t
$pno_delai = duree_de_la_prochaine_PNO( $t ); // idem
if ( $pno_date < $date + $debut ) { // cette prochaine PNO tombe dans le delai
$delai += $pno_delai; // on ajoute le delai de cette pno
$ok = false; // il va falloir refaire un boucle
$t = $pno_date + $pno_delai; // on calcule désormais a partir de la fin de la PNO trouvée
continue; // refaire la boucle
}
} while ( false ) ;
------------------------------
petit conseil, utilise des temps absolus et aditionnable comme des chiffres.
Genre le nombre de secondes écoulées depuis le 1er janvier 1970... Soit le résultat de time() ou mktime()
red2
Messages postés6Date d'inscriptionmardi 29 mai 2007StatutMembreDernière intervention30 mai 2007 30 mai 2007 à 15:18
Salut,
Merci d'avoir répondu!
Ton algorithme est bien mais "$date = // début du délai" ne tombe pas forcément dans une période ouvrée.
Alors je rajouterai à ton algorithme un teste pour voir si $date se trouve dans une période ouvrée ou non.
Si oui je fais j'applique ton algo sinon je prend comme date de début la première heure ouvrée en aval.
red2
Messages postés6Date d'inscriptionmardi 29 mai 2007StatutMembreDernière intervention30 mai 2007 30 mai 2007 à 15:18
Salut,
Merci d'avoir répondu!
Ton algorithme est bien mais "$date = // début du délai" ne tombe pas forcément dans une période ouvrée.
Alors je rajouterai à ton algorithme un teste pour voir si $date se trouve dans une période ouvrée ou non.
Si oui j'applique ton algo sinon je prend comme date de début la première heure ouvrée en aval.
red2
Messages postés6Date d'inscriptionmardi 29 mai 2007StatutMembreDernière intervention30 mai 2007 30 mai 2007 à 15:18
Salut,
Merci d'avoir répondu!
Ton algorithme est bien mais "$date = // début du délai" ne tombe pas forcément dans une période ouvrée.
Alors je rajouterai à ton algorithme un teste pour voir si $date se trouve dans une période ouvrée ou non.
Si oui j'applique ton algo sinon je prend comme date de début la première heure ouvrée en aval.
Vous n’avez pas trouvé la réponse que vous recherchez ?
J_G
Messages postés1406Date d'inscriptionmercredi 17 août 2005StatutMembreDernière intervention28 août 200710 30 mai 2007 à 17:18
et oui.... c'est bien ça le plus dur dans l'algo (avec l'autre fonction)
Je pense qu'il faut voir tes PNO comme des objets :
class PNO {
var $jds // "jour de la semaine" soit :0 pour dimanche, 6 pour samedi
var $heure_debut; // entre 0 et 23
var $minute_debut; // entre 0 et 59
var $duree; // en seconde SVP !!!
//puis une fonction qui donne la distance avec un temps en secondes
function distance( $t ) {
// décomposer $t en ces composante "calendrier" [année, mois, jour, heure, minute, seconde, jds] (cf. strftime() ou date())
// Remplacer dans ces composantes par les valeurs heure et minute de ce PNO
// Ajouter un correctif à jour pour atteindre le "bon" jds (en comparant le jds de $t et de $this)
// Faire l'opération inverse en retransformant ces composantes en temps "secondes"
// retourner cette valeur
}
}
Puis tu fais une liste (array()) de tes PNO, tu compares les distances, prends la plus petite, te souviens de l'index pour la fonction suivante...
Malheuresement pour toi, il reste toujours pas mal de travail à faire