Calcul de nombre de jours entre deux date

cs_fouroulou Messages postés 31 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 7 avril 2008 - 21 mai 2005 à 15:00
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 22 mai 2005 à 22:11
Bonjour tout le monde,

Je voudrais calculer le nombre de jours entre deux dates en eliminant les dimanche, puis récuperer le résultat
dans un Tedit.

Merci

10 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
21 mai 2005 à 16:58
Bonjour



Programmes-tu pour le plaisir ?



Dans ce cas, je te donne quelques pistes :



En Delphi, la date est une donnée de type TDate.

Pour convertir un String de format jj/mm/yy en Date nombre (réel) il faut utiliser la fonction StrToDate.

Cela devrait te permettre de calculer la différence entre 2 dates.

Il y a un dimanche pour 7 jours...

Connais-tu l'opérateur Div ? Il te permet d'effectuer une division sur
deux entiers, en négligeant donc les chiffres après la virgule.

Oui, mais sur deux entiers, ça va pas le faire avec deux réels ?

Heureusement, il existe la fonction Trunc...



Si ça te prend trop la tête ou que tu es trop débutant, ou si tu ne
pratiques pas pour le plaisir, ou si tu es pressé, j'ai une petite
fonction toute chaude que je viens de mettre au point suite à ta
question. Moi, ça m'amuse...



Bonne prog'



japee (débutant + 3)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 mai 2005 à 22:04
uses dateUtils;


procedure TForm1.Button1Click(Sender: TObject);
var
d1, d2: TDateTime;
Days, Sundays: integer;
begin
d1 := StrTodate('01/01/2005');
d2 := Now;
Days := DaysBetween(d2, d1);
Sundays := Days div 7;
ShowMessageFmt('%d jours dont %d dimanche', [Days, Sundays]);
end;



<HR color=#008000>



Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
21 mai 2005 à 23:31
Deux messages auraient-ils été retirés de cette discussion ?

J'ai reçu 3 avis de message sur ce sujet et n'en trouve qu'un.

J'ai l'impression d'avoir raté un épisode entre mon post donnant
quelques pistes à fouroulou et le code de Delphiprog fourni "clés en
main"...



Bonne prog'
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
22 mai 2005 à 10:12
Salut,



Un petit problème avec ton code Delphiprog : même nombre de dimanche(s) si je lance le programme samedi ou lundi !

Il faut ajouter quelques lignes :





procedure TForm1.Button1Click(Sender: TObject);

var

d1, d2: TDateTime;

Days, Sundays, Jour1, Reste : integer;

begin

d1 := StrTodate('01/01/2005');

d2 := Now;

Days := DaysBetween(d2, d1);

Sundays := Days div 7;

Reste := Days mod 7;

Jour1 := DayOfTheWeek(d1);

if (Jour1 + Reste) > DaySunday Then

inc( Sundays);

ShowMessageFmt('%d jours dont %d dimanche', [Days, Sundays]);

end;


Il me reste un doute : > ou > = ?


Ken@vo

Code, Code, Codec !






[%3C/body ]
0

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

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
22 mai 2005 à 13:43
Kenavo, j'ai pas tout capté mais tu dois sans doute avoir raison. J'avais pourtant vérifié sur un calendrier, mais bon...


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
22 mai 2005 à 16:58
Salut les gars !



Je pense qu'on a faux tous les trois !



Kenavo >

il y a un bug si, Days étant inférieur à 7, tu calcules de lundi à
lundi, de mardi à mardi, etc... par exemple du 16 mai au 23 mai (7
jours dont 2 dimanches !)



Delphiprog >

J'avais fait une fonction similaire à la tienne, et n'avais pas tenu
compte du chevauchement d'un dimanche si Days était inférieur à 7.
Heureusement que Kenavo nous a mis la puce à l'oreille.



Il vaut mieux dans tous les cas, pour simplifier le problème (et rester
logique), ne pas admettre un dimanche comme date de départ ou d'arrivée.

J'ai donc un peu cogité (faut bien occuper ses Sundays *) et ça donne ça sous forme de fonction :



function GetDifferenceDatesDaysAndSundays(d1, d2: TDate): String;

var

Days, Sundays, DayOfWeek1: Integer;

begin

if (DayOfWeek(d1) 1) or (DayOfWeek(d2) 1) then

ShowMessage('Les dimanches ne sont pas pris en compte')

else if D1 > D2 then

ShowMessage('La première date entrée doit être antérieure à la seconde')

else

begin

Days := DaysBetween(d2, d1);

//Days := Trunc(d2 - d1); // pour les pauvres Delphi 4...

Sundays := Days div 7;

DayOfWeek1 := DayOfWeek(d1);

if (Days < 7) then

if (DayOfWeek1 xor 7 < Days) then

inc(Sundays);

Result := Format('%d jour(s) dont %d dimanche(s)', [Days, Sundays]);

end;

end;



J'ai pas mal testé, il semblerait qu'il n'y ait pas de bug...



Bonne prog'



japee



* j'aurais plus envie de m'en rajouter que de les décompter, lol
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
22 mai 2005 à 17:19
Désolé, erreur de copier-coller d'un code ayant transité par Notepad et non vérifié par la suite...



Le code précédent est donc erronné, voici le code correct :



function GetDifferenceDatesDaysAndSundays(d1, d2: TDate): String;

var

Days, Sundays, DayOfWeek1: Integer;

begin

DayOfWeek1 := DayOfWeek(d1);

if (DayOfWeek1 1) or (DayOfWeek(d2) 1) then

ShowMessage('Les dimanches ne sont pas pris en compte !')

else if D1 > D2 then

ShowMessage('La première date doit être antérieure à la seconde')

else

begin

//Days := DaysBetween(d2, d1);

Days := Trunc(d2 - d1); // pour les pauvres Delphi 4

Sundays := Days div 7;

if (Days < 7) then

if (DayOfWeek1 xor 7 < Days) then

inc(Sundays);

Result := Format('%d jour(s) dont %d dimanche(s)', [Days, Sundays]);

end;

end;



Si tu peux enlever mon post précédent, Delphiprog, stp, j'ai trop honte...



Bonne prog'
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
22 mai 2005 à 18:31
Non, non, ça bugge à un certain moment...



Ce code semble tenir le coup :



function GetDifferenceDatesDaysAndSundays(d1, d2: TDate): String;

var

Days, Sundays, DayOfWeek1: Integer;

begin

DayOfWeek1 := DayOfWeek(d1);

if (DayOfWeek1 1) or (DayOfWeek(d2) 1) then

ShowMessage('Les dimanches ne sont pas pris en compte !')

else if D1 > D2 then

ShowMessage('La première date doit être antérieure à la seconde')

else

begin

//Days := DaysBetween(d2, d1);

Days := Trunc(d2 - d1); // pour les pauvres Delphi 4

Sundays := Days div 7;

if (Days mod 7) <> 0 then

if (DayOfWeek1 xor 7 < Days div 7) then

inc(Sundays);

Result := Format('%d jour(s) dont %d dimanche(s)', [Days, Sundays]);

end;

end;



A suivre ?



Bonne prog'



japee
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
22 mai 2005 à 20:36
Mon bon Japee,



Je ne trouve pas ce bug dont tu me colles la paternité !



Si je compte de lundi à lundi,




Sundays :<gras>Days div 7; // Sundays</gras> 1 (Days = 7) Reste :Days mod 7; // Reste 0 Jour1 :DayOfTheWeek(d1); // Jour1 1 (Lundi)

if (Jour1 + Reste) > DaySunday then // Jour1 + reste = 1 inférieur à 7 (DaySunday)

inc(
Sundays);
// pas d'incrémentation : résultat = 1 dimanche





N'aurais-tu point été abusé par la ressemblance ô combien troublante
entre le fonctions DayOfWeek et DayOfTheWeek (celle-ci faisant
partie de l'unité DateUtils , dont les pauvres Delphiquatrenautes ne peuvent point jouir !)



si :

if (DayOfWeek(Now) = 1) then

ShowMessage('C''est aujourd''hui Dimanche, Ô ma jolie Maman !') ;


ne pose pas de problème,

if (DayOfTheWeek(Now) = 1) then


ShowMessage('C''est lundi, c''est raviolis !') ;


n'en pose pas plus !




Comme le dit l'aide (Delkphi 7) Pour DayOfWeek :



Remarque : DayOfWeek n'est pas conforme à la norme ISO 8601
(dans laquelle lundi est considéré comme le premier jour de la
semaine). Pour obtenir une version conforme ISO 8601, utilisez la
fonction DayOfTheWeek
.



Pour infos, sont déclarées ainsi et dans DateUtils les constantes de jour de la semaine :

DayMonday = 1;

DayTuesday = 2;

DayWednesday = 3;

DayThursday = 4;

DayFriday = 5;

DaySaturday = 6;

DaySunday = 7;



Soit :
DayOfWeek(Date) :=
(DayOfTheWeek(Date) mod 7) + 1;




Et je confirme ma préférence première pour > tout court !



Ken@vo

Code, Code, Codec !






[%3C/body ]
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
22 mai 2005 à 22:11
Mon bon Kenavo,



Si, tu as raison, j'ai été honteusement abusé par la ressemblance des 2 fonctions.



Ne disposant effectivement pas de DayOfTheWeek dans D4, j'en ai
étourdiment conclu que tu avais fait une erreur d'inattention (c'est
tellement facile de mettre sur le dos des autres...) et j'ai
effectivement modifié ton code dans ce sens.



Mea culpa.



Je suis d'autant plus confus qu'aucun de mes essais ne fonctionne
correctement. Et je n'ai pas eu le temps d'approfondir la chose.



Et chez moi, lundi, ça va pas être ravioli, mais chili (con carne, mais
ça rime plus), et peut-être bien mardi et mercredi aussi, vu la
quantité (g)astronomique que j'ai préparée...



Bonne fin de dimanche à tous, faut pas mollir, et bonne prog'



Kenavo dit, Ken@vo !



japee
0
Rejoignez-nous