Interval précis entre deux dates

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

13 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
15 août 2006 à 00:54
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
3
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
12 août 2006 à 13:08
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
0
cs_PHIL63 Messages postés 76 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 10 août 2010
12 août 2006 à 13:44
Merci, j'ai honte de ne pas y avoir pensé....
la solution était si simple... pas besoin de fonction...

Philippe DROUET
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
12 août 2006 à 16:19
Heu... oui, mais le résultat va être bizarre... il faudra l'interpréter, en tout cas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_PHIL63 Messages postés 76 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 10 août 2010
13 août 2006 à 19:22
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
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
14 août 2006 à 13:04
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
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
14 août 2006 à 13:06
Pardon, 7 valeurs numériques, puisque DecodeTime renvoie 4 valeurs...
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 août 2006 à 13:31
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...
0
cs_PHIL63 Messages postés 76 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 10 août 2010
14 août 2006 à 17:27
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
0
cs_PHIL63 Messages postés 76 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 10 août 2010
15 août 2006 à 09:50
Merci Japee.
N'oublie quand même pas d'aller faire dormir les yeux lol

Philippe DROUET
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
15 août 2006 à 09:56
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...
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
3 sept. 2006 à 00:43
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'
0
cs_PHIL63 Messages postés 76 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 10 août 2010
3 sept. 2006 à 07:40
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
0
Rejoignez-nous