CALCUL DE L'ÉCART ENTRE 2 DATES, RESULTAT SOUS FORME JJ MM AA

florenth - 7 mai 2007 à 20:30
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 - 29 déc. 2008 à 12:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42616-calcul-de-l-ecart-entre-2-dates-resultat-sous-forme-jj-mm-aa

cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
29 déc. 2008 à 12:57
En faisant ceci, calcul en heure puis diviser par 24 pour trouver en jours.

Dtp1.Date, Dtp2.Date = TDateTimePicker

A tester

procedure TFTestDate.BCalculclick(Sender: TObject);
var
Date2, Date1 : TDate;
Diff : Double;
begin
Date1:=Dtp1.Date;
Date2:=dtp2.Date;
Diff := HoursBetween(Date1,Date2) /24;
Edit1.text:=FloatToStr(Diff)+ ' Jours';
End;

pour la différence entre le 29/02/2004 et 01/03/2005 on trouve 366 jours donc 1 an et 1 jour ce qui est exact.

@+,

Cincap
jjnouiphp Messages postés 33 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 21 janvier 2020 1
29 déc. 2008 à 12:06
@Cincap
Heu! J'ai mal compté avec mes doigts, en effet c'est 2 mois et un jour qui séparent le 31 décembre 2003 du 1er mars 2004.
En ce qui concerne les méthodes pour arriver au bon résultat il faut d'abord se mettre d'accord sur ce qui est le bon résultat.
Donc, si tu le veux bien on considère que les exemples fournis plus haut sont corrects mis à part la bourde du 3 mois qui est bien en réalité 2 mois et 1 jour ?

à tout de suite ?
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
29 déc. 2008 à 11:16
@jjnouiphp,pour moi, entre le 31/12/2003 et 01/03/2004 il y a 2 mois et 1 jour et non 3 mois comme tu le supposes.

Il faudrait imaginer des variables pour l'année bisectile.

@+,

Cincap
jjnouiphp Messages postés 33 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 21 janvier 2020 1
29 déc. 2008 à 11:01
Bonjour à tous

@CINCAP, merci de ta réponse rapide.
Si j'ai bien compris ton raisonnement (que je partagerai) il ne faut tenir compte que de l'année bissextile en cours
exemples:
entre le 28 février 2004 et le 1er mars 2004 il y a bien une journée (le 29)
entre le 28 février 2004 et le 1er mars 2005 il y a bien un an et un jour
entre le 28 février 2004 et le 1er mars 2006 il y a bien deux ans et un jour
et pour chaque 1er mars postérieur (même s'il y a des années bissextiles) on trouvera un intervalle de x années et un jour.

en suivant le raisonnement :
entre le 31 décembre 2003 et le 1er mars 2004 il y a bien 3 mois même si 2004 est bissextile ?

Pardon pour ce long texte mais si on veut faire avancer le"schmillblick" c'est nécessaire.

à bientôt
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
29 déc. 2008 à 09:32
Bonjour à toutes et à tous,

@jjnouiphp, bien compris, pour ma part, le calcul doit se faire au niveau de l'année bisectile (et non bissextiles).

Soit augmenter d'un jour le résultat.

Maintenant faudrait voir le calcul en heure = 8784,00167527667 Heures.

Cela vaut la peine de trouver je pense.

@+,

Cincap
jjnouiphp Messages postés 33 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 21 janvier 2020 1
29 déc. 2008 à 01:35
Bonjour à tous

@CINCAP, Merci de me signaler ce qui semble un bug, mais en cherchant une solution je me suis posé une question :
à date égale dans deux années doit-on intégrer la notion de jours supplémentaires pour les années bissextiles ?
Exemple: je suis né le 1/3/2000, nous sommes le 1/12/2008, je suis âgé de :
- 8 ans, 9 mois et 1 jour
- 8 ans, 9 mois et 1 jours + 2 jours pour les années bissextiles ?

de même en limitant les dates à une année non bissextile :
l'écart entre le 1/3/2005 et le 1/4/2005 qui est de 1 mois et un jour (soit 31 jours)
l'écart entre le 1/4/2005 et le 1/5/2005 qui est aussi de 1 mois et 1 jour (soit 30 jours)

En fait je pense que lorsque l'on donne l'écart entre 2 dates en nombre d'années, de mois et de jour on ne tient pas compte des années bissextiles et qu'il en est tout autrement si l'on compte en jours.

Bien entendu si quelqu'un à la réponse je suis preneur !

à bientôt et bonne fin d'année
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
27 déc. 2008 à 16:29
Bonjour à toutes et à tous,

@ jjnouiphp, Ta fonction présente aussi un bug, en effet si on reprend le calcul entre le 29/02/2004 et 01/03/2005 on obtient 1 an et 1 jour mais si on indique le 28/02/2004 et 01/03/2005 on a encore 1 an et 1 jour ce qui n'est pas correct par contre si on indique le 27/02/2004 et 01/03/2005 on obtient 1 an et 2 jours.

Comme quoi .....

@+,

Cincap
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
8 mai 2007 à 21:48
C'était quoi ta direction initiale, Flo ? (je suis un gros curieux...)
Ce qui est sûr, c'est que les chemins qui mènent chacun à la programmation, et à Delphi en particulier, sont certainement étonnants, sauf sans doute pour ceux qui sont génétiquement prédestinés (j'ai pas osé dire programmés), lol...
Sinon, la super classe gérant les divers calendriers, solaires, lunaires, et les différents formats de date, c'est une oeuvre considérable. J'y songe le matin en me rasant, mais pour l'instant, je n'ai pas le loisir de m'y consacrer.

A +
En effet, quelle perspicacité japee, j'avais (décidemment) lu trop vite ^^.

Sinon, pour revenir à cette histoire de dates, en fait, ce qu'il faudrait faire, c'est une sorte de classe comme l'a fait f0xi pour le TColor et qui permet de renvoyer une date sous ses différentes représentations dans les calendriers.

Exemple: Tu rentres une date grégorienne et tu demande son équivalent julien.

Et puis, ça enlève le problème des incohérences de calendriers (comme cette fameuse nuit de 10 jours) puisqu'alors, il n'y aurais pas d'équivalent grégorien de certaines dates juliennes (celles qui datent d'avant sa création).

Et si en plus, quelqu'un a la bonne idée de lui faire prendre en charge les différents formats informatiques des dates (format depuis le 01/01/0001, format depuis le début de la période Unix, ...) ça résoudrait pas mal de problèmes.

Quand je pense que certains se sont mis au Delphi pour *généalogiser*... lool ;-)

A+
Flo

PS: tous les amateurs ont leur propre raison de s'être mis au Delphi. Moi aussi je me suis un peu (beaucoup !) égaré de ma direction initiale...
jjnouiphp Messages postés 33 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 21 janvier 2020 1
8 mai 2007 à 20:47
Tout est bien qui finit bien

A une autre fois
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
8 mai 2007 à 19:59
@Florenth : attention de ne pas confondre "méprise" et "mépris" :
Il n'est pas question de mépriser qui que ce soit dans cet échange ^^
Mais je crois qu'on s'est tous bien compris.
Tu as raison, j'essaierai de mieux commenter mes sources, surtout pour ces histoires de date, ça prend vite la tête.
Quand à la fonction entre le 5/10/1582 et les 15/10/1582, tu ne crois pas si bien dire. Il serait trop facile de lui faire renvoyer 0 (zéro).
Les paramètres qui entrent en jeu sont affaire d'érudits, la mise en oeuvre du calendrier grégorien ayant différé selon les pays (la "révolution d'octobre" russe eut lieu au mois de novembre, pour situer...).

@jjnouiphp : heu... je retire "embrouillamini" ;-)
OK, je comprends mieux le chmilblic ...
"la méprise de Florenth" : s'il y en a un qui devrait mépriser quelqu'un, c'est certainement pas moi, mais japee.

De toutes façons, on n'empêche pas de poster plusieurs sources sur le même sujet, c'est juste que ta source me semblait quand même assez "copiée", c'est tout.
Maintenant, s'il s'agit d'une erreur de manipulation de ta part, alors tant mieux, tout est réglé.

@japee: en relisant le commentaire de jjnouiphp, j'ai vu cela :
"ne pouvant non plus m'appuyer sur les commentaires absents du code, je n'ai pu proposer de corrections"

Eh oui, japee, tu ne commentes pas assez ton code !!! lol

En tout cas, je vous souhaite bonne chance à tous les deux, car les dates, c'est vraiment pas facile (ya longtemps que j'ai arreté ce truc moi).
Le jour où ta fonction renverra 1 jour pour la différence entre le 5/10/1582 et le 15/10/1582, on te déclarera surhomme des dates !! ^^

++
jjnouiphp Messages postés 33 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 21 janvier 2020 1
8 mai 2007 à 17:19
Ca y est !!

Super désolé, je comprends la méprise de Florenth, mille excuses.

Je me suis trompé au moment du post et c'est par erreur que j'ai posté la version de test avec la partie de code appartenant à Japee.

La version que je devais diffuser n'est pas celle-là bien sûr.

Merci Japee de ta réponse plus cordiale, "l'embrouillamini" m'avais un peu chagriné ;)

Je vais donc refaire le post

A plus et bon coding
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
8 mai 2007 à 16:37
Salut jjnouiphp.

Non, personne ne dit que c'est le même travail.
Qu'il n'y ait pas de malentendu à ce sujet.

Mais pourquoi utiliser ma fonction GetYMDBetween de cette manière ?
Elle n'est pas conçue pour ça...
Il aurait suffi (ligne 193 de ton code) de faire :

signe := DateTimePicker1.Date <= DateTimePicker1.Date;

ou pourquoi ne pas créer une fonction :

function IsNotNegative(FromDate, ToDate: TDateTime): Boolean;
begin
Result := FromDate <= ToDate;
end;

appelée ainsi :

signe := IsNotNegative(DateTimePicker1.Date, DateTimePicker1.Date);

Par contre, il semblerait que ma fonction comporte un bug...
Il y a apparemment une erreur de logique.
Merci de l'avoir remarqué.

A plus.
jjnouiphp Messages postés 33 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 21 janvier 2020 1
8 mai 2007 à 15:14
Pour Florenth et japee :
Je suis désolé si vous pensez que j'ai 'pompé' le travail d'un autre. Je n'en vois pas l'intérêt. J'ai écris les quelques lignes car je n'avais pas trouvé (d'accord j'avais mal cherché) une routine de ce genre; c'est seulement au moment de poster que j'ai vu qu'il y avait un classement par rubrique et qu'il existait une rubrique consacrées aux dates et heures.
C'est là que j'ai découvert le travail de Japee, j'ai alors pris le temps de monter "vite fait" un test pour voir si ce que j'avais fait ne venait pas en doublon.
En testant en parallèle les 2 méthodes j'ai découvert que pour la routine de Japee donne un écart d'un an entre le 29 fevrier 2004 et le 1er mars 2005, pour moi il s'est passé un an et un jour.
Plutôt que de me lancer dans une critique qui aurait pu être mal comprise, ne pouvant non plus m'appuyer sur les commentaires absents du code, je n'ai pu proposer de corrections.

A part le fait que j'ai utilisé deux DateTimePicker et un bouton (comment faire autrement d'ailleurs) je ne vois pas de similitudes.

Si vous le souhaitez je peux poster une version utilisant les 2 méthodes pour que vous puissiez comparer les résultats.

Cordialement

jjnouiphp
On dirait bien qu'une des fonction utilisée dans Unit1.pas est issue du travail de japee (dis le moi si je me trompe). Ce serait bien de citer les véritables auteurs...
Rejoignez-nous