Calculer une date/heure de fin à partir d'une durée
carolet
Messages postés26Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention26 septembre 2013
-
23 janv. 2013 à 16:08
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDerniè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
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention 1 août 201312 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)
}
}
cs_jopop
Messages postés1540Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention 1 août 201312 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)