Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Verbesserte Version von Years-, MonthsBetween + DurationStr (https://www.delphipraxis.net/142396-verbesserte-version-von-years-monthsbetween-durationstr.html)

Sir Rufo 27. Okt 2009 14:10


Verbesserte Version von Years-, MonthsBetween + DurationStr
 
Liste der Anhänge anzeigen (Anzahl: 3)
Moin,

habe ich mich doch gerade aufgeregt, dass die Funktionen Delphi-Referenz durchsuchenYearsBetween und Delphi-Referenz durchsuchenMonthsBetween falsche, da gerundete Ergebnisse liefern.
Code:
YearsBetween( '01.01.2009', '01.01.2010' ) => 0 Jahre
MonthsBetween( '01.01.2009', '01.01.2010' ) => 11 Monate
Wer kann denn mit dem Mist arbeiten - ich nicht, also habe ich einfach mal 2 Funktionen geschrieben, die diesen Fehler nicht haben.
Vielleicht kann es ja noch jemand gebrauchen :)

edit:

Ich habe das jetzt mal alles in einer Unit uDurationStr zusammengefasst und angehängt.
Zum Ausprobieren auch eine kleine Demo als Exe, wo alle Parameter der Funktion über das Formular geändert werden können.
Screenshot des Demo-Programms, na klar :mrgreen: ihr sollt ja nicht die Katze im Sack kaufen

cu

Oliver

s.h.a.r.k 27. Okt 2009 14:48

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
sowas gehört in die CodeLib :zwinker:

Wolfgang Mix 27. Okt 2009 15:39

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
Schließe mich meinem Vorredner an und würde Daniel bitten, die beiden Funktionen
mit in meine Unit DateUtils2 zu übernehmen.
Um Verwechlungengen zu vermeiden, sollten sie dann aber andere Namen haben,
z.B. YearsBetween2 und MonthsBetween2.

Gruß

Wolfgang

RWarnecke 27. Okt 2009 15:44

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
und/oder in mein Code-Orakel Online :zwinker:

Sir Rufo 27. Okt 2009 15:51

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
Zitat:

Zitat von Wolfgang Mix
Schließe mich meinem Vorredner an und würde Daniel bitten, die beiden Funktionen
mit in meine Unit DateUtils2 zu übernehmen.
Um Verwechlungengen zu vermeiden, sollten sie dann aber andere Namen haben,
z.B. YearsBetween2 und MonthsBetween2.

Gruß

Wolfgang

Jo, in die DateUtils2 passen die gut rein.

Als Namen könnte man auch YearsBetweenAsHumansCount bezeichnen :mrgreen:

Ich habe da gerade eine weitere Zeitfunktion (die, wofür ich die genaue Jahres/Monatsangabe brauchte), die auch gut in die DateUtils2 reinpasst.

Schieb ich gleich mal in den ersten Thread rein.

cu

Oliver

himitsu 27. Okt 2009 15:54

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
direkt ausgerechnet, ohne Annäherung über 'ne Schleife

Delphi-Quellcode:
Procedure CheckedSwap(Var ANow, AThen: TDateTime); Inline;
  Var Temp: TDateTime;

  Begin
    If ANow <= AThen Then Exit;
    Temp := ANow;
    ANow := AThen;
    AThen := Temp;
  End;

Function YearsBetween(ANow, AThen: TDateTime): Integer;
  Var Yn, Yt, Mn, Mt, Dn, Dt: Word;

  Begin
    CheckedSwap(ANow, AThen);
    DecodeDate(ANow, Yn, Mn, Dn);
    DecodeDate(AThen, Yt, Mt, Dt);
    Result := Yt - Yn;
    If (Mt < Mn) or ((Mt = Mn) and ((Dt < Dn))) Then Dec(Result);
  End;

Function MonthsBetween(ANow, AThen: TDateTime): Integer;
  Var Yn, Yt, Mn, Mt, Dn, Dt: Word;

  Begin
    CheckedSwap(ANow, AThen);
    DecodeDate(ANow, Yn, Mn, Dn);
    DecodeDate(AThen, Yt, Mt, Dt);
    Result := (Yt - Yn) * 12 + (Mt - Mn);
    If Dt < Dn Then Dec(Result);
  End;
Es wird abgerundet und sozusagen immer der Tagesbeginn gewertet.
Also Anfang=01.01. und Ende=31.12. ist noch kein ganzes Jahr

Wolfgang Mix 27. Okt 2009 15:59

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
@Sir Rufo

Die Namensgebung ist Dein Ding

Gruß

Wolfgang

DP-Maintenance 27. Okt 2009 16:11

DP-Maintenance
 
Dieses Thema wurde von "Daniel G" von "Open-Source" nach "Neuen Beitrag zur Code-Library hinzufügen" verschoben.
Passt hier in der Tat (vorerst) besser rein...

Sir Rufo 27. Okt 2009 16:27

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
Zitat:

Zitat von himitsu
direkt ausgerechnet, ohne Annäherung über 'ne Schleife

Delphi-Quellcode:
Procedure CheckedSwap(Var ANow, AThen: TDateTime); Inline;
  Var Temp: TDateTime;

  Begin
    If ANow <= AThen Then Exit;
    Temp := ANow;
    ANow := AThen;
    AThen := Temp;
  End;

Function YearsBetween(const ANow, AThen: TDateTime): Integer;
  Var Yn, Yt, Mn, Mt, Dn, Dt: Word;
  d1, d2 : TDateTime;
  Begin
    d1 := ANow; d2 := AThen;
    CheckedSwap(d1, d2);
    DecodeDate(d1, Yn, Mn, Dn);
    DecodeDate(d2, Yt, Mt, Dt);
    Result := Yt - Yn;
    If (Mt < Mn) or ((Mt = Mn) and ((Dt+Frac(d2) < Dn+Frac(d1)))) Then Dec(Result);
  End;

Function MonthsBetween(const ANow, AThen: TDateTime): Integer;
  Var Yn, Yt, Mn, Mt, Dn, Dt: Word;
  d1, d2 : TDateTime;
  Begin
    d1 := ANow; d2 := AThen;
    CheckedSwap(d1, d2);
    DecodeDate(d1, Yn, Mn, Dn);
    DecodeDate(d2, Yt, Mt, Dt);
    Result := (Yt - Yn) * 12 + (Mt - Mn);
    If Dt+Frac(d2) < Dn+Frac(d1) Then Dec(Result);
  End;

Die Version ist - es wird nun nicht mehr gerundet - so auch gekauft :mrgreen:

edit: const in die Funktionen angefügt, damit der Stack schön klein bleibt :mrgreen:

Wolfgang Mix 27. Okt 2009 16:45

Re: Verbesserte Version von YearsBetween, MonthsBetween
 
@Sir Rufo

Mir fällt gerade ein, daß ich YearsBeween schon 1992 problemloser ohne Delphi
unter DBase entwickelt habe.
Die Grundidee ist diese

Du findest den Code unter CodeLib/SysUtils2/function Age();

Teste 'mal bitte

Grüß

Wolfgang


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz