Calculer une date/heure de fin à partir d'une durée

Signaler
Messages postés
27
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2013
-
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
-
Bonjour,

Je cherche à calculer une date/heure de fin à partir d'une durée, en sachant qu'il faut enlever les heures non travaillées.
Les heures travaillées allant du lundi 6 h au vendredi 20 h.
J'ai comme info la date/heure du début et la durée.

Exemple : J'ai une tâche qui commence le vendredi à 15h, elle dure 8h, elle va donc se terminer le lundi à 9h.

Il faut conserver les heures car il y a plusieurs tâches qui se suivent et la date/heure de début d'une tâche correspond à la date/heure de fin de la tâche précédente.

J'utilise la fonction suivante, mais elle n'enlève que les week-ends et il n'y a pas les heures.
Et il y a sûrement plus simple.

Quelqu'un pour m'aider svp, je galère.
Merci

<%
'//---------------------------------------------------------------------------
'// CALCULE la date de fin et Enlève les jours des week-ends
'//---------------------------------------------------------------------------
dim cpte
Function CalculDateFin(DateD, duree)

Dim NbJourWE
Dim DateC, DateFin

'//Cas de la durée non entière : ex. 2,5 jours
If (CStr(duree) > CStr(Int(duree))) Then
duree = duree + 1
End If

DateC = DateD
DateFin = DateAdd("d", Int(duree), DateC)
If (cpte = 0) Then
DateFin = DateAdd("d", duree - 1, DateC)
Else
If (DatePart("w", DateC) 1 Or DatePart("w", DateC) 7) Then
DateC = DateAdd("d", 1, DateC)
End If
End If

cpte = cpte + 1
While (CDate(DateC) <= DateFin)

If (DatePart("w", DateC) 1 Or DatePart("w", DateC) 7) Then
NbJourWE = NbJourWE + 1
End If
DateC = DateAdd("d", 1, DateC)


Wend
If (NbJourWE > 0) Then
DateFin = CalculDateFin(DateFin, NbJourWE)
NbJourWE = 0
End If
cpte = 0
CalculDateFin = DateFin


End Function
%>

2 réponses

Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Salut,

as-tu penser à regarder du côté de la récursivité ?
Je verrais bien un truc du genre en pseudo-code :
// constantes TimeMin (6:00:00) et TimeMax (20:00:00) existent
// DateTime.Time retourne la composante Time de l'instance
// DateTime.Date retourne la composante Date de l'instance
// DateTime.Day retourne le jour de la semaine de l'instance
function Date FinDeTache(DateTime DateDebut, int duree) {

  // si week-end on boucle
  if ((DateDebut.Day Samedi) || (DateDebut.Day Dimanche))
    return FinDeTache(DateDebut +1jour, duree)

  // si fin dans le jour en cours (fin de récursivité)
  if ((DateDebut.Time + duree) <= HeureMax)
    return (DateDebut + duree)

  // sinon on fait ce qu'on peut ce jour et on regarde ce qu'on fera ensuite
  else {
    // on calcule la durée consommée le jour en cours
    int DureeConsommee = DateDebut.Time - HeureMax
    // on construit la date correspondant au lendemain première heure
    DateTime Demain = new DateTime(DateDebut.Date, TimeMin)
    // on boucle sur le lendemain
    return FinDeTache(Demain, Duree - DureeConsommee)
  }
}


A tester
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Bon, y'a quelques lacunes (fonctions AddDays() & AddHours() pour plus de précision) et erreurs dans mon pseudo-codes (DureeConsommee = HeureMax - DateDebut.Time, et non l'inverse)

Et peut-être encore d'autres, mais l'idée est là.