Calcul de durée entre deux dates. - Divers - Programmation
Marsh Posté le 31-01-2013 à 08:54:58
Ca va dépendre du langage utilisé, du format des dates, etc...
Par exemple en .net il y a le format datetime, tu peux soustraire 2 datetime entre eux, tu obtiens un timespan qui t'indique le nombre de jours, heures, etc...
Dans d'autres langages c'est plutot un timestamp, qui représente le nombre de secondes. Tu peux donc faire la différence entre 2 timestamp, et avec des divisions et des modulos calculer le nombre d'années, jours, etc...
Marsh Posté le 31-01-2013 à 11:08:42
Ok merci pour ta réponse.
Ben comme d'hab, c'est avec Ada.
Marsh Posté le 31-01-2013 à 16:13:25
Elles sont après 1970 tes dates?
A+,
Marsh Posté le 31-01-2013 à 16:38:06
gilou a écrit : Elles sont après 1970 tes dates? |
Non, techniquement, la limite inférieur c'est 1901-01-01 0.0 et la sup c'est 2399-12-31 86400.0 ou un truc dans le genre. c'est un Ada.Calendar.Time.
Marsh Posté le 31-01-2013 à 17:09:11
Je ne connais (toujours pas ) ada, mais d'après :
http://archive.adaic.com/standards [...] 09-06.html
Code :
|
Tu peux effectuer une soustraction de 2 objets de type TIME, et obtenir un objet de type DURATION en retour.
Et d'apres http://www.adapower.com/rm95/RM-9-6.html :
Citation : There is a predefined fixed point type named Duration, declared in the visible part of package Standard; a value of type Duration is used to represent the length of an interval of time, expressed in seconds |
Donc la différence entre 2 TIME te donnerai le nombre de secondes qui sépare les 2.
A partir de là, tu convertis le nombre de secondes en années, mois, etc... (désolé y a pleins de convertisseurs sur le net mais je trouve pas une explication sur la méthode).
En gros si tu as par exemple 3500 secondes tu fais :
- pour les heures le résultat entier de 3750 / 3600 -> 1h, reste 150 secondes
- pour les minutes le résultat entier de 150 / 60 -> 2min, reste 30sec
- pour les secondes le reste -> 30 sec
Donc 3500sec = 1h2min5ec
3600 pour 60sec par minute * 60min par heure
60 pour 60sec par minute
donc tu fais pareil avec 86400 (60*60*24) pour les jours etc...
Marsh Posté le 31-01-2013 à 17:35:04
x1fr a écrit : Je ne connais (toujours pas ) ada, mais d'après :
|
D'abord merci encore pour ta réponse.
Alors justement j'ai fait et refait des test et
Je ne peut pas calculer tous les intervalles.
Citation : Ne peut calculer l'interval entre Time minimum et maximum. |
Citation : Ne peut calculer l'interval entre heure courante et maximum. |
Par contre pour l'intervalle entre Time minimum et Clock ça passe.
Citation : Elasped time : 3537106230.915097000 |
Mais jusqu'à quand ?
Marsh Posté le 01-02-2013 à 03:43:11
J'ai été jeter un oeil à gnat: package Ada.Calendar
Il y a
function Time_Of
(Year : Year_Number;
Month : Month_Number;
Day : Day_Number;
Seconds : Day_Duration := 0.0) return Time
qui va retourner un Time pour chacune de tes dates, et un
procedure Difference
(Left : Time;
Right : Time;
Days : out Long_Integer;
Seconds : out Duration;
Leap_Seconds : out Integer)
pour faire la différence entre les deux.
A+,
Marsh Posté le 01-02-2013 à 13:17:49
Oui J'ai découvert aussi la Difference hier.
Après pour compter les année, tout les quatre ans je supprime un jour de plus et c'est bon ?
Marsh Posté le 01-02-2013 à 16:32:18
J'ai testé un truc.
Code :
|
Résultat :
Citation : Elapsed years : 499 |
Marsh Posté le 02-02-2013 à 01:02:21
Citation : Bi := (The_Years_Bot - The_Years_Top)/4; |
C'est ce qui est faux (déjà tu comptes 2100, 2200 et 2300 dans le lot or ils ne sont pas bissextiles, et de plus, pour le dernier jour de trop, c'est probablement une histoire d'intervalles).
A+,
Marsh Posté le 02-02-2013 à 01:56:22
Merci Gilou,
J'ai modifié monde code comme ceci :
Code :
|
Il me reste un décalage de 23 heures à élucider.
Avec ma date d'anniversaire à 43 ans de différence j'ai bien 43 ans 0 jour mais 82800.0 seconde de trop.
Marsh Posté le 02-02-2013 à 02:19:56
Citation : (Day_Count((365 * Years)+bi)-1) |
Il correspond à quoi ce -1?
A+,
Marsh Posté le 02-02-2013 à 02:26:32
gilou a écrit :
Il correspond à quoi ce -1? |
A rien, j'essayais un truc pour l'histoire d'intervalle
Marsh Posté le 19-01-2015 à 11:50:33
Bonjour,
Je reviens ici pour avoir votre expertise.... J'ai fait à vue de nez...
Toujours pour calculer la durée entre deux date exprimé en Years months days houres minutes seconds et rest.
D'abord je compte les années, les mois et les jours :
Code :
|
Reste à faire une image formaté des secondes restante pour le jour courant.
Code :
|
C'est surtout au niveau arithmétique je je vais galérer si c'est pas bon.
Marsh Posté le 19-01-2015 à 13:42:09
1) Faut que tu gères le nb de jours pour chaque mois (30 ou 31) ainsi que le cas des années bissextiles (février à 28 ou 29 jours).
2) faut que tu gères le pb de l'heure d'été et de l'heure d'hiver. En effet, suivant l'intervalle considéré, cette heure en plus ou en moins peut s'annuler. Du coup, faut pas considérer qu'une journée = 84400 secondes
Je t'invites à regarder le code de mon applis Astres (cf ma signature), en particulier la fonction getGraphicAxeXValuesStats() du fichier /Astres/Support/Stats/StatsLibrary.php
3) Si ton algo est basé sur un calcul de secondes écoulé uniquement, attention aux secondes intercalaires qui sont ajoutées certaines années en juin ou en décembre
Marsh Posté le 23-01-2015 à 15:36:53
rufo a écrit : 2) faut que tu gères le pb de l'heure d'été et de l'heure d'hiver. En effet, suivant l'intervalle considéré, cette heure en plus ou en moins peut s'annuler. Du coup, faut pas considérer qu'une journée = 84400 secondes |
Avant toute opération il faut convertir les dates entrées en temps universel (UTC) sinon c'est vite l'horreur oui.
Pour le reste s'il s'agit de calculs de dates à visée astronomique, je ne saurais trop lui conseiller d'utiliser le jour julien en interne. Ça se représente très bien en virgule fixe sur un entier ce qui élimine la plupart des pertes de précision.
Marsh Posté le 23-01-2015 à 15:46:59
Attention : comme l'indique l'article que tu donnes en ligne, jour julien <> calendrier julien
Citation : Le qualificatif julien est source d'ambigüités : les datations en jours juliens et les dates du calendrier julien n'ont aucun rapport et ne doivent pas être confondues. |
Marsh Posté le 30-05-2015 à 21:07:02
Bonjour,
Mon nouveau code :
Code :
|
Je me suis fait aider, et la je viens de corriger au moins un peu.
Mais j'ai peut-être introduit d'autre problème.
Marsh Posté le 30-05-2015 à 21:47:36
Et peut-être, remplacer cette condition :
Code :
|
par
Code :
|
Marsh Posté le 30-05-2015 à 22:04:06
Je le recolle entièrement, j'ai apporté trois correction, une dans Last_Years, une à la comparaison ci dessus qui est avec 1 et days -1 en bas de code.
Code :
|
Finalement c'est ça mon algo.
Code :
|
Marsh Posté le 30-01-2013 à 20:33:01
Bonjour,
Je me suis cassé les dent une nuit pour finalement laisser tomber mais je viens vous poser la question !
Comment calculer la durée entre deux dates en [Années-jours-heures:minute:secondes.miliseconde] ?
A vous si ça vous amuse ou si j'ai un problème.