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

carolet Messages postés 26 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 26 septembre 2013 - 23 janv. 2013 à 16:08
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 - 23 janv. 2013 à 17:35
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

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
23 janv. 2013 à 17:31
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
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
23 janv. 2013 à 17:35
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à.
0
Rejoignez-nous