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

cs_PHIL63 76 Messages postés dimanche 9 février 2003Date d'inscription 10 août 2010 Dernière intervention - 12 août 2006 à 10:17 - Dernière réponse : cs_PHIL63 76 Messages postés dimanche 9 février 2003Date d'inscription 10 août 2010 Dernière intervention
- 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 

13 réponses

Répondre au sujet
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 15 août 2006 à 00:54
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de japee
cs_neko 135 Messages postés jeudi 14 août 2003Date d'inscription 12 octobre 2006 Dernière intervention - 12 août 2006 à 13:08
0
Utile
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
cs_PHIL63 76 Messages postés dimanche 9 février 2003Date d'inscription 10 août 2010 Dernière intervention - 12 août 2006 à 13:44
0
Utile
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
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 12 août 2006 à 16:19
0
Utile
Heu... oui, mais le résultat va être bizarre... il faudra l'interpréter, en tout cas.
Commenter la réponse de japee
cs_PHIL63 76 Messages postés dimanche 9 février 2003Date d'inscription 10 août 2010 Dernière intervention - 13 août 2006 à 19:22
0
Utile
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
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 14 août 2006 à 13:04
0
Utile
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
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 14 août 2006 à 13:06
0
Utile
Pardon, 7 valeurs numériques, puisque DecodeTime renvoie 4 valeurs...
Commenter la réponse de ThWilliam
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 14 août 2006 à 13:31
0
Utile
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
cs_PHIL63 76 Messages postés dimanche 9 février 2003Date d'inscription 10 août 2010 Dernière intervention - 14 août 2006 à 17:27
0
Utile
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
cs_PHIL63 76 Messages postés dimanche 9 février 2003Date d'inscription 10 août 2010 Dernière intervention - 15 août 2006 à 09:50
0
Utile
Merci Japee.
N'oublie quand même pas d'aller faire dormir les yeux lol

Philippe DROUET
Commenter la réponse de cs_PHIL63
Emandhal 199 Messages postés dimanche 2 mars 2003Date d'inscription 10 octobre 2006 Dernière intervention - 15 août 2006 à 09:56
0
Utile
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
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 3 sept. 2006 à 00:43
0
Utile
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
cs_PHIL63 76 Messages postés dimanche 9 février 2003Date d'inscription 10 août 2010 Dernière intervention - 3 sept. 2006 à 07:40
0
Utile
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.