Décomposer des durées

JavaScript, mais c'est plus de l'algo...

L'auteur de ce sujet a trouvé une solution à son problème.
Staff
Auteur du sujet

Coucou,

Je suis en train de me faire un script me permettant de calculer mes prestations (mes heures, mes primes). Je suis confronté à quelques interrogations au niveau de la décomposition des durées.

Par exemple si je travaille de 14h00 à 22h15 en semaine, les tranches se divisent comme suit :

  • de 14h à 16h : prestation normale
  • de 16h à 22h : prestation irrégulière (+ bonus de 125%)
  • de 22h à 22h15 : prestation irrégulière (+ bonus de 150%)

En gros, comment faire un algo qui reçoit deux timestamps (début et fin de prestation) et découpe automatiquement le "durée" en différentes tranches dans le but de leur appliquer les taux (qui varient en plus selon le jour de la semaine, férié, de garde…).

Le truc embêtant est qu'il s'agit de prestations irrégulières, donc ça ne commence ni ne finit pas toujours aux mêmes heures.

Je n'ai pas d'idée qui me vient à l'esprit comme étant intéressante/optimale. Je pense détecter la "tranche" de début de la prestation, et boucler dessus jusqu'à la fin de la prestation, et additionner au passage les minutes en faisant plein de if et de else… ça me semble complètement naze !

Je travaille en JS, donc je peux utiliser Date(), mais là aussi, ça me semble tout aussi foireux…

Une idée intéressante ?

Responsable de la validation - TodoFox - Le JavaScript, c'est bon, mais pas jQuery ! Séries

+0 -0

Hello,

C'est pas possible de calculer le timestamp de la limite entre prestation normale et prestation irrégulière?

Du coup avec en entrée 2 timestamps, tu regardes si y a une des limites entre les deux, si oui tu calcules la durée de chaque coté, sinon, c'est une plage unique.

Ou alors y a autre chose que j'ai pas compris

Xia, peluche olympienne |Python en s'amusant | Random xkcd

+0 -0

Salut,

Quel est la règle qui fait que l'on passe d'une prestation normale à une prestation irrégulière ?
Si je par du principe que c'est l'heure c'est assez simple.

Comme ce sont des journées il faut partir du principe que minuit c'est 0 et que 23h59 c'est 86.399 (le nombre de secondes dans une journée).
Tu fais un parcours suivant tes tranches horaires. De minuit à 8h c'est une prestation irrégulière à 150%, de 8 à 16h c'est une prestation à 100%, de 16 à 22h c'est une prestation à 125% et ainsi de suite.

Donc dans mon exemple tu à 3 tranches horaires, si à partir de la suffit de regardé si ta prestation est dans la tranche horraire, grossièrement en pseudo code:

1
2
3
4
5
6
7
8
  debut prestation = 50400 (14h)
  fin prestation = 79200 (22h)
  pour toute tranche horaire
    si debut presation <= debut tranche horaire
      salaire += (fin tranche horraire - debut prestation) * salaire à la seconde * taux tranche horaire
      debut prestation = fin tranche horaire
    fin si
  fin boucle

edit: bon la le pseudo code est clairement pas complet car il manque la gestion de la fin de la prestation, mais tu vois le principe ;)

Édité par La source

+0 -0

Si j'ai bien compris, il suffirait juste de convertir ces deux timestamps en heure du jour, par exemple (si c'est des secondes) :

1
2
debutJournee = timestampDebut % (60 * 60 * 24)
finJournee = timestampFin % (60 * 60 * 24)

(en prenant évidemment en comptes les éventuels fuseaux horaires).

On peut ainsi déterminer les tranches de cette manière :
08h à 16h : dureeTrancheA = min(finJournee, (60 * 60 * 16)) - max(debutJournee, (60 * 60 * 08))
16h à 22h : dureeTrancheB = min(finJournee, (60 * 60 * 22)) - max(debutJournee, (60 * 60 * 16))
22h à 24h : dureeTrancheC = min(finJournee, (60 * 60 * 24)) - max(debutJournee, (60 * 60 * 22))

Donc de manière générale :
dureeTranche = min(finJournee, (60 * 60 * finTranche)) - max(debutJournee, (60 * 60 * debutTranche))

EDIT : Évidemment que si une tranche est une durée négatif, il ne faudra pas ajouter le revenu correspondant qui sera alors également négatif.

Édité par Olybri

+0 -0
Staff
Auteur du sujet

Merci pour vos suggestions, ça rejoint grosso-modo ce que j'envisageais de faire.

Je vais tenter un mix d'un peu tout ^^ . Faire une while et avancer une date "pivot" (avec un timestamp) qui sera à chaque fois le début de la prochaine "tranche" (si elle existe). On va bien voir…

Responsable de la validation - TodoFox - Le JavaScript, c'est bon, mais pas jQuery ! Séries

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte