Ajouter un délai à une date en tenant compte des heures ouvrées

red2 Messages postés 6 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 30 mai 2007 - 30 mai 2007 à 13:44
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 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.

9 réponses

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 9
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()

A+
0
red2 Messages postés 6 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 30 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.
0
red2 Messages postés 6 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 30 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.
0
red2 Messages postés 6 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 30 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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 9
30 mai 2007 à 15:37
Oui, c'est bien ça...
0
red2 Messages postés 6 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 30 mai 2007
30 mai 2007 à 16:15
if ( $pno_date < $date + $debut ) { // cette prochaine PNO tombe dans le delai
Que représente $début ?
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 9
30 mai 2007 à 16:19
Salut,

C'est un bourde... $date+$delai

desolé
0
red2 Messages postés 6 Date d'inscription mardi 29 mai 2007 Statut Membre Dernière intervention 30 mai 2007
30 mai 2007 à 16:49
Excuse moi d'être aussi lourd mais tu t'y prendrais comment pour calculer :
debut_de_la_prochaine_PNO( $t ) ?
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 9
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
0