Interval précis entre deux dates [Résolu]

Messages postés
76
Date d'inscription
dimanche 9 février 2003
Dernière intervention
10 août 2010
- - Dernière réponse : cs_PHIL63
Messages postés
76
Date d'inscription
dimanche 9 février 2003
Dernière intervention
10 août 2010
- 3 sept. 2006 à 07:40
Bonjour à toutes et à tous,
Voilà ma question :
Existe-t-il une fonction sous delphi 6 qui renvoi l'interval précis entre deux dates (Années, mois, jours, heures, minutes, secondes, millisecondes) ?
J'ai bien trouvé des fonctions du style DaysBetween etc mais aucune ne renvoi l'interval complet.
Si une bonne âme avais une petite idée ou une petite fonction sous la main....
Merci.

Philippe DROUET
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
3
Merci
J'ai posté un code qui ressemble à ce que tu essayes de faire, mais sans les heures, minutes et secondes. Peut-être plus tard ?
C'est ici :
GetYMDBetween() - Différence entre 2 dates (Années, Mois, Jours)
Bonne prog' pour ceux qui y sont encore à c't'heure, lol

Merci japee 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de japee
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Dernière intervention
12 octobre 2006
0
Merci
Ben si c'est des TDateTime, il suffit de les soustraire l'une à l'autre, ensuite tu peux la formater ( FormatDate ) pour avoir une chaine de caractères lisible.

bouh
Commenter la réponse de cs_neko
Messages postés
76
Date d'inscription
dimanche 9 février 2003
Dernière intervention
10 août 2010
0
Merci
Merci, j'ai honte de ne pas y avoir pensé....
la solution était si simple... pas besoin de fonction...

Philippe DROUET
Commenter la réponse de cs_PHIL63
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
0
Merci
Heu... oui, mais le résultat va être bizarre... il faudra l'interpréter, en tout cas.
Commenter la réponse de japee
Messages postés
76
Date d'inscription
dimanche 9 février 2003
Dernière intervention
10 août 2010
0
Merci
Bonjour,
Bon après un test, ça me donne un résultat plus que folklorique même après formatage.
Je vais quand même chercher dans cette voie.
Merci quand même.

Philippe DROUET
Commenter la réponse de cs_PHIL63
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
0
Merci
Salut Philippe,

Tu peux te créer une fonction(procedure) dans laquelle tu compares tes 2 dates avec les procedures DecodeDate et DecodeTime. Voir Aide Delphi.

DecodeDate(Date1,  Year1, Month1, Day1);
DecodeDate(Date2, Year2, Month2, Day2);
IntervalYear:= Year2 - Year1;
...
et tu fais la même chose avec DecodeTime.
Tu vas donc avoir 6 valeurs numériques avec lesquelles tu fais ce que tu veux.

A +
Thierry
Commenter la réponse de ThWilliam
Messages postés
424
Date d'inscription
mardi 3 janvier 2006
Dernière intervention
26 novembre 2013
0
Merci
Pardon, 7 valeurs numériques, puisque DecodeTime renvoie 4 valeurs...
Commenter la réponse de ThWilliam
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
0
Merci
Salut Phil,


Quel est l'intérêt de ce calcul ? Est-ce que c'est pour faire un truc dans le genre "Vous êtes né depuis 20 ans 3 mois 12 jours 9 heures 1 minute 59 secondes et 857 millisecondes" ?
Sinon, je vois pas trop l'intérêt du calcul, j'ai un peu de mal à m'investir dans la recherche de la solution...
Commenter la réponse de japee
Messages postés
76
Date d'inscription
dimanche 9 février 2003
Dernière intervention
10 août 2010
0
Merci
Salut Japee,
C'est un peut ça, mais pas pour un décompte de date de naissance et un décompte à la seconde me suffira....

Pour ThWilliam :
Merci, je vais également chercher dans cette voie.

Encore merci à tous les deux.

Philippe DROUET
Commenter la réponse de cs_PHIL63
Messages postés
76
Date d'inscription
dimanche 9 février 2003
Dernière intervention
10 août 2010
0
Merci
Merci Japee.
N'oublie quand même pas d'aller faire dormir les yeux lol

Philippe DROUET
Commenter la réponse de cs_PHIL63
Messages postés
199
Date d'inscription
dimanche 2 mars 2003
Dernière intervention
10 octobre 2006
0
Merci
J'ai eut besoin un jour d'un calcul de ce genre...
Je donne mon code, il renvoie le temps entre 2 dates sauf MSec (j'en avais pas besoin) en string (adaptable facilement en Year..Seconds). Par contre ma solution donne le résultat avec les semaines... à toi d'adapter le code...

Function BetweenTimeToExtendStr(aBeginTime, aEndTime: TDateTime): String;

Const

TABLEDECOMPOSITIONTEMPS: Array[0..6] of String = (' Année', ' Mois', ' Semaine', ' Jour', ' Heure', ' Minute', ' Seconde');

VALUESPERTIMES: Array[1..6] of Word = (MonthsPerYear, High(Word), 0, HoursPerDay, MinsPerHour, SecsPerMin);
ANNEE 0; MOIS 1; SEMAINE = 2; JOUR = 3;
HEURE 4; MINUTE 5; SECONDE = 6;

Var

BeginTableDTValues, EndTableDTValues: Array[0..6] of Word;

tmpDateTime: TDateTime;

z: Integer;

Msec: Word;

Begin

Result := '';

If CompareDateTime(aBeginTime, aEndTime)=GreaterThanValue Then

begin

tmpDateTime := aBeginTime;

aBeginTime := aEndTime;

aEndTime := tmpDateTime;

end;

BeginTableDTValues[SEMAINE] := 0;

EndTableDTValues [SEMAINE] := 0;

DecodeDateTime(aBeginTime, BeginTableDTValues[ANNEE], BeginTableDTValues[MOIS], BeginTableDTValues[JOUR], BeginTableDTValues[HEURE], BeginTableDTValues[MINUTE], BeginTableDTValues[SECONDE], Msec);

DecodeDateTime(aEndTime, EndTableDTValues [ANNEE], EndTableDTValues [MOIS], EndTableDTValues [JOUR], EndTableDTValues [HEURE], EndTableDTValues [MINUTE], EndTableDTValues [SECONDE], Msec);

For z := High(VALUESPERTIMES) downto Low(VALUESPERTIMES) do

If z<>SEMAINE Then

begin

If EndTableDTValues[z]
begin

Inc(EndTableDTValues[z], When(VALUESPERTIMES[z]=0, MONTHDAYS[IsLeapYear(BeginTableDTValues[ANNEE])][BeginTableDTValues[MOIS]], VALUESPERTIMES[z]));

Inc(BeginTableDTValues[z-When(VALUESPERTIMES[z]=0, 2, 1)]);
end;

Dec(EndTableDTValues[z], BeginTableDTValues[z]);

end;

Dec(EndTableDTValues[ANNEE], BeginTableDTValues[ANNEE]);

Msec := EndTableDTValues[JOUR] div DaysPerWeek;

Inc(EndTableDTValues[SEMAINE], Msec);

Dec(EndTableDTValues[JOUR], Msec*DaysPerWeek);

Msec := 0;

For z := Low(EndTableDTValues) to High(EndTableDTValues) do If EndTableDTValues[z]>0 Then Inc(Msec);

For z := Low(EndTableDTValues) to High(EndTableDTValues) do

If EndTableDTValues[z]>0 Then

begin

Result := Result+When(Result<>'', When(Msec=1, ' et ', ', '), '')+IntToStr(EndTableDTValues[z])+TABLEDECOMPOSITIONTEMPS[z];

If (EndTableDTValues[z]>1) and (Result[Length(Result)]<>'s') Then Result := Result+'s';

Dec(Msec);

end;

If Result='' Then Result := '';

End;

When se présente comme ceci :

Function When(Condition: Boolean; Vrai, Faux: String): String; overload;

Begin

If Condition Then When := Vrai

else When := Faux;

End;

Function When(Condition: Boolean; Vrai, Faux: Integer): Integer; overload;

Begin

If Condition Then When := Vrai

else When := Faux;

End;




Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...
Commenter la réponse de Emandhal
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
0
Merci
Salut Phil,


Tu es toujours sur le coup ? As-tu résolu le problème ?

Je suis en train de déboguer la démonstration d'une fonction qui calcule la différence en année, mois, jours, heures, minutes, secondes entre deux dates, et qui remplacera ou complètera le code que j'ai posté précédemment.

Ce déboguage me pose des problèmes, mais la fonction elle-même me semble au point.

En fait, elle est basée sur la même approche que la précédente.

Si ça t'intéresse, si tu n'as pas le temps d'attendre la mise à jour de
mon code, ou que tu as envie de tester la fonction, je l'envoie ici.

A toi de voir... 


Bonne prog'
Commenter la réponse de japee
Messages postés
76
Date d'inscription
dimanche 9 février 2003
Dernière intervention
10 août 2010
0
Merci
Salut japee,
j'ai utilisé une autre méthode, elle ne doit pas être parfaite mais elle suffira bien pour le moment...
merci encore pour toutes tes réponses.

Philippe DROUET
Commenter la réponse de cs_PHIL63

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.