Getymdbetween() - différence entre 2 dates (années, mois, jours)

Description

Calcule la différence entre deux dates au format TDateTime.
Différence comptée en Ans, Jours, Mois.
La résultat de type Booléen sera True si la date soustraite est plus petite (ancienne) que la date de laquelle on soustrait, dans le cas contraire le résultat retourné sera False.

Ce code, une fois de plus, m'a été inspiré par une question récente posée sur le forum, même s'il n'y répond pas exactement.
J'ai retroussé mes manches, car il m'a semblé qu'une telle fonction n'existait pas.
J'ai pas mal testé, en comptant beaucoup sur mes doigts, lol, et ça m'a l'air cohérent. Je n'ai pas trouvé de bug, mais je vous fais confiance pour ça... ;-)
Par contre, il doit y avoir moyen d'optimiser, mais le code m'a l'air robuste, et puis est-il bien nécessaire de gagner en rapidité, même si cette fonction traite du temps qui passe...

Source / Exemple :


{
Le résultat retourné est True si la différence est positive, False dans le cas contraire.
Mais les variables Years, Months et Days sont toujours en valeur absolue.
}

function GetYMDBetween(FromDate, ToDate: TDateTime;
  var Years, Months, Days: Integer): Boolean;
var
  FromY, FromM, FromD,    // from date
  ToY, ToM, ToD: Word;    // to date
  TmpDate: TDateTime;
  PreviousMonth: Byte;
  DaysInMonth: Byte;
begin
  Result := FromDate <= ToDate;
  if not Result then
  begin
    TmpDate := ToDate;
    ToDate := FromDate;
    FromDate := TmpDate;
  end;
  DecodeDate(ToDate, ToY, ToM, ToD);
  DecodeDate(FromDate, FromY, FromM, FromD);
  Years := ToY - FromY;
  Months := ToM - FromM;
  Days := ToD - FromD;
  if Days < 0 then
  begin
    Dec(Months);
    PreviousMonth := ToM + (Byte(ToM = 1) * 12) - 1;
    case PreviousMonth of
      1,3,5,7,8,10,12: DaysInMonth := 31;
      4,6,9,11       : DaysInMonth := 30;
      else
        DaysInMonth := 28 + Byte(IsLeapYear(ToY));
    end;
    Days := DaysInMonth - Abs(Days);
  end;
  if Months < 0 then
  begin
    Dec(Years);
    Months := 12 - Abs(Months);
  end;
end;

Conclusion :


Bon, j'ai fait un peu vite, j'espère que je n'oublie rien.
Garanti compilable D4 et plus, les autres D 32 bits ça devrait passer.
Vaporisé au Raid insectes rampants, devrait pas y avoir de bugs (merde, c'était le Décapfour, je sais pas ce que ça va donner, lol)

Codes Sources

A voir également

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.