Calcul durée avec jours ouvrées
Discutez d'informatique ici !
-
Cliffe
- Membre Rationnel
- Messages: 967
- Enregistré le: 12 Juin 2012, 14:25
-
par Cliffe » 13 Sep 2017, 14:54
Bonjour,
je cherche la méthode la plus rapide et efficace de résoudre mon problème.
Nos employés réalisent des tâches (t1, ..,tn) les unes après les autres.
On mémorise le début et la fin de réalisation de chacune d'entre elle (d_t1, f_t1) ... (d_tn, f_tn).
Sachant qu'une tâche peut démarrée un jour donnée et être clôturer plusieurs jours/semaines plus tard ...
Ma problématique est de calculer le temps total de réalisation des 'n' tâches. Sachant que les heures de travail sont 8h-12h => 13h30-17h30 du lundi au jeudi et 09h00-12h00 le vendredi.
Merci.
-
pascal16
- Membre Légendaire
- Messages: 6663
- Enregistré le: 01 Mar 2017, 13:58
- Localisation: Angoulème : Ville de la BD et du FFA. gare TGV
-
par pascal16 » 13 Sep 2017, 19:44
d_t1, f_t1 ont sans doute été calculés à partir de la durée de chaque tâche.
perso, je ferais ; une routine pour calculer le temps restant de chaque tâche.
-> il vaut la durée (que tu dois déjà avoir) si la tâche n'est pas commencée
-> il vaut le temps restant si la tâche est commencée
on fait la somme de toutes les durées.
-
danyL
- Membre Rationnel
- Messages: 681
- Enregistré le: 03 Jan 2015, 14:29
-
par danyL » 13 Sep 2017, 20:49
un petit exemple numérique serait le bienvenu
-
Ben314
- Le Ben
- Messages: 21512
- Enregistré le: 11 Nov 2009, 22:53
-
par Ben314 » 13 Sep 2017, 22:54
Salut,
J'ai pas trop d'idée concernant le fait de savoir quelle serait la méthode la plus simple pour effectuer le calcul, mais par contre (et exceptionnellement....), j'ai l'impression d'avoir parfaitement compris la question.
Donc sur un exemple, ça donnerais ça :
L'ordi., en entrée tu lui donne ça :
Début de la tâche = Mercredi 13 septembre à 10h25
Fin de la tâche = Mardi 19 septembre à 14h45
Et ce qu'il doit te calculer c'est ça :
Mercredi 13 : travail de 10h25 à 12h puis de 13h30 à 17h30 soit 1h35 + 4h = 5h35
Jeudi 14 : travail de 8h à 12h puis de 13h30 à 17h30 => 4h + 4h = 8h
Vendredi 15 : travail de 9h à 12h => 3h
Lundi 18 : travail de 8h à 12h puis de 13h30 à 17h30 => 4h + 4h = 8h
Mardi 19 : travail de 8h à 12h puis de 13h30 à 14h45 => 4h + 1h15 = 5h15
Total = 29h50 (=5h35 + 8h + 3h + 8h + 5h15)
A mon avis, vu la vitesse des machines actuelles (et à moins que ce soit pour utiliser avec un langage de programmation bien pourri), on doit pouvoir se contenter d'une bête boucle qui parcours les jours en partant de celui de "début" jusqu'à celui "d'arrivé" avec un truc modulo 7 pour savoir quel jour de la semaine on est.
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius
-
pascal16
- Membre Légendaire
- Messages: 6663
- Enregistré le: 01 Mar 2017, 13:58
- Localisation: Angoulème : Ville de la BD et du FFA. gare TGV
-
par pascal16 » 14 Sep 2017, 09:41
un plan de charge papier avec des étiquettes de couleur de la longueur de chaque tâche, c'était visuel et simple.
-
fatal_error
- Modérateur
- Messages: 6610
- Enregistré le: 22 Nov 2007, 13:00
-
par fatal_error » 17 Sep 2017, 17:21
hello,
pour suivre l'idée de ben, on peut s'épargner quelques boucles.
on peut considérer l'invariant 'la semaine' vu que qqsoit la semaine de travail, on a fait le même nombre d'heures.
Du coup
d1 => ts1, d2 => ts2 (où ts1, ts2 respectivement les timestamp de d1, d2,en ms)
nbSemaines = (ts2-ts1)/(semaineEnMs)
on a donc tpsTravaille = E(nbSemaines)*tpsParSemaine + leftOver
avec leftOver qui consiste à aller de l'heure courante de ts1, jusqu'à l'heure du "jour" de ts2.
si on nomme j1, j2 les jours de la semaine associés à ts1 et ts2.
alors si j2-j1 > 0
//j2 vient apres j1
leftOver = (j2-j1+1)*jourEnMs
sinon
//il faut boucler la semaine...
leftOver = (j1-j2+1-2)*jourEnMs
finsi
leftOver -= offset(j1,1)+offset(j2,-1)
avec offset(j, order) qui représente le temps travaillé depuis le début du jour au début du travail pour j1, et fin du travail à fin du jour pour j2
calcul offset(j,order):
si order==1
//calculer de 8h jusquà j
sinon
//calculer de j jusqu'à 17h30
fsi
si j.day()==vendredi
//enlever 1h (car on commence à 9h)
fsi
Deux parties que j'ai tenté d'optimiser (à vérifier)
1) - le modulo 7 de la semaine (je pense que c'est mieux)
2) - le calcul pour la semaine donnée (en "factorisant" les jours travaillés au lieu d'incrémenter par demi journées)
Je reste perplexe sur 2)...
la vie est une fête
-
Cliffe
- Membre Rationnel
- Messages: 967
- Enregistré le: 12 Juin 2012, 14:25
-
par Cliffe » 18 Sep 2017, 10:41
Je vais faire une simple boucle :
- Code: Tout sélectionner
// Calcul durée d'une tâche 't'
duree_tache = 0; list_day = split_into_day(t)
for day in list_day:
duree_tache += calculDuree(day)
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités