dernier jour du mois / nombre de jours dans le mois

dernier jour du mois / nombre de jours dans le mois - Delphi/Pascal - Programmation

Marsh Posté le 11-12-2007 à 11:49:22    

Salut à tous !
 
Le dernier jour du mois ce n'est pas seulement le jour de la paye, c'est aussi un fichu nombre qui varie selon les mois et les années, entre 28, 29, 30 et 31.
Je cherche donc une fonction Delphi qui prendrait en entrée un TDate ou un TDateTime, et qui me renverrait un entier ou un TDate ou un TDateTime contenant le dernier jour du mois ou le nombre de jours du mois.
L'un de vous aurait ce genre d'infos ?
(la fonction de Recherche ne me donne rien à ce sujet, au revoir les flammers)

Reply

Marsh Posté le 11-12-2007 à 11:49:22   

Reply

Marsh Posté le 11-12-2007 à 11:54:56    

Je sais qu'il est possible de le faire par calcul en décomposant la date, en ajoutant un mois puis en retirant un jour, mais je cherche une fonction qui fait ça toute seule.

Reply

Marsh Posté le 12-12-2007 à 14:55:09    

Y a pas de fonction toute faite, mais c'est pas vraiment difficile de calculer le dernier jour du mois :  
 
d := IncMonth(RecodeDay(LaDate, 1)) - 1
 
Pour le nombre de jours du mois il y a DaysInMonth / DaysInAMonth (depuis Delphi 6 - au cas où tu as une plus vieille version...)
 
Ce qui permettrait de faire pour la 1e fonction :
 
d := RecodeDay(DaysInMonth(LaDate))


Message édité par antp le 12-12-2007 à 15:00:33

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-12-2007 à 17:00:25    

Salut ,  
 
Suivant ta version tu peux regarder avec EndOfTheMonth .


---------------

Reply

Marsh Posté le 13-12-2007 à 14:23:25    

Ha mince j'avais pas vu qu'elle existait aussi celle-là [:ddr555]

Reply

Marsh Posté le 13-12-2007 à 20:36:45    


Pas grave va .
 
Tu vas  t'en remettre non ?  :D


---------------

Reply

Marsh Posté le 17-12-2007 à 14:28:09    

Merci de vos réponses :)
 
Malheureusement pour ce projet j'utilise Deplhi 5 et les fonctions citées ci-dessus sont toutes inconnues.
 
J'ai donc codé ma propre fonction, que je copie ici au cas où ça intéresserait d'autres personnes :
 

Code :
  1. {******************************************************************************************}
  2. {*** Cette fonction renvoie le numéro du dernier jour du mois relatif à la date fournie ***}
  3. {******************************************************************************************}
  4. function LastDayOfMonth(d: TDate): integer;
  5. var A,M,J: Word;
  6. begin
  7.    { On incrémente la date reçue d'un mois }
  8.    d := IncMonth(d,1);
  9.    { On décode la date obtenue }
  10.    DecodeDate(d,A,M,J);
  11.    { On réencode la date incrémentée d'un mois, avec un jour à 1 }
  12.    d := EncodeDate(A,M,1);
  13.    { On revient en arrière d'un jour ==> on obtient le dernier jour du mois demandé }
  14.    d := d-1;
  15.    { On décode à nouveau la date obtenue pour récupérer le numéro du jour }
  16.    DecodeDate(d,A,M,J);
  17.    { On renvoie le résultat du calcul }
  18.    result := J;
  19. end;


 
Et tant qu'on y est j'ai aussi écrit une fonction qui renvoie le numéro de la semaine pour la date fournie en paramètre, je partage au cas où :
 

Code :
  1. {***********************************************************************************************}
  2. {*** Cette fonction renvoie le numéro de la semaine dans laquelle se trouve la date fournie. ***}
  3. {***********************************************************************************************}
  4. function TFSRIS01.NumSemaine(d: TDate): integer;
  5. var A,M,J: Word;
  6.     d1: TDate;
  7.     nb: integer;
  8. begin
  9.    { On calcule le nombre de jours qui nous séparent du dimanche suivant }
  10.    nb := 8-DayOfWeek(d);
  11.    if (nb = 7) then nb := 0;
  12.    { On ajout ce nombre à la date fournie pour se positionner sur le dernier jours de la semaine demandée }
  13.    d := d+nb;
  14.    { On décode la date obtenue pour récupérer l'année}
  15.    DecodeDate(d,A,M,J);
  16.    { On vérifie que la date ne se trouve pas dans une zone "charnière" entre deux années}
  17.    if ((M = 1) and ((J-nb) <= 0)) then
  18.    begin // période charnière
  19.       d1 := EncodeDate(A,1,1);
  20.       nb := DayOfWeek(d1);
  21.       if ((nb >= 6) or (nb <= 1)) then
  22.          A := A-1;
  23.    end;
  24.    { On crée une date au premier janvier de l'année demandée }
  25.    d1 := EncodeDate(A,1,1);
  26.    { On calcule le nombre de semaines entières écoulées depuis le 1er janvier }
  27.    nb := Round((d-d1+1)/7);
  28.    { On renvoie le résultat du calcul }
  29.    result := nb;
  30. end;


Message édité par tantemerde le 06-02-2008 à 10:50:30
Reply

Marsh Posté le 17-12-2007 à 16:22:30    

La fonction IncMonth existe dans Delphi 5, c'est plus simple pour ajouter 1 mois ;)
 
Et en alternative du DaysInMonths que j'avais utilisé, on peut faire MonthsDays[IsLeapYear(Annee)][mois];

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed