Time unit
Problématique
Il faut être capable de proposer un système de gestion des heures qui permette d'utiliser indifféremment les unités :
- heure et minute
- heure et centième d'heure
Ce qui donne en nombres :
- hh.mm avec hh qui va de 0 à 24 et mm de 0 à 59
- hh.cc avec hh qui va de 0 à 24 et cc de 0 à 99
Il y a correspondance entre les deux par les formules fabuleuses :
minutes | centième | centième arrondi |
---|---|---|
0 | 0 | 0 |
1 | 1,66 | 2 |
2 | 3,33 | 3 |
3 | 5 | 5 |
4 | 6,66 | 7 |
5 | 8,33 | 8 |
6 | 10 | 10 |
On voit donc que le passage des minutes vers les centièmes entraine des erreurs d'arrondi.
Il en est de même dans le sens centièmes vers minutes.
Il faut donc une unité qui permette de stocker à la fois les centièmes et les minutes sans erreur d'arrondi. En effet, la saisie des heures de vol est une opération légale qui ne doit pas souffrir d'imprécision.
Solution
La solution consiste à prendre (grosso modo) le PPCM des minutes et des centièmes, ie: PPCM(60,100)=600 (en fait le PPCM est 300 je crois PPCM(60,100)=60*100/PGCD(60,100)=6000/20 mais entre 300 et 600 il y a autant de chiffres, à voir...).
Je préconise donc d'adopter un système "sexacentimal" (hh.sss).
Formules de conversion :
minute | sexacentième |
---|---|
0 | 0 |
1 | 10 |
2 | 20 |
3 | 30 |
4 | 40 |
5 | 50 |
6 | 60 |
Ainsi, on laisse le club libre de choisir son système (et surtout on ne lui demande pas de changer) et on ouvre donc le "marché" d'OF à la terre entière et quelques planètes autours.
Conséquences
- Il faut bien sûr créer une classe qui manipule les sexacentièmes.
- L'heure de début de vol sera soit en minutes soit en centièmes et on ne saisira pas l'heure de fin de vol. En fait, on ne stockera pas l'heure de fin de vol, mais par contre on peut la saisir et proposer une durée du vol. Il y a donc trois "combos" : début, durée, fin. Elles sont préremplies avec une heure de début correspondant à l'ouverture du vol et une durée égale à zéro (d'ou une fin égale à l'heure de début), et dès que l'une des combos est modifiée, une autre combo doit l'être selon la règle suivante :
- si on modifie la durée, c'est l'heure de fin qui est automatiquement modifiée
- si on modifie l'heure de début ou l'heure de fin, c'est la durée qui est modifiée
- les sommes ne se font que sur les durées. Il ne doit jamais y avoir d'opération effectuée sur l'heure de début, hormis pour déterminer l'heure de fin (en rajoutant la durée).
- Attention au vol de nuit quand on ajoute la durée à l'heure de début, on affiche l'heure correcte mais le jour pris en compte est celui du départ
Mise en oeuvre
Paramètre TIME_UNIT
Création d'un paramètre TIME_UNIT dans la table parameter qui doit exister si la gestion des vols est activée.
En son absence, la valeur à considérer par défaut est la valeur 0.
Le champ IntValue peut prendre les valeurs suivantes :
- 0 : minutes
- 1 : centièmes