AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Verbesserte Version von Years-, MonthsBetween + DurationStr
Thema durchsuchen
Ansicht
Themen-Optionen

Verbesserte Version von Years-, MonthsBetween + DurationStr

Ein Thema von Sir Rufo · begonnen am 27. Okt 2009 · letzter Beitrag vom 28. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Verbesserte Version von Years-, MonthsBetween + DurationStr

  Alt 27. Okt 2009, 15:10
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 ihr sollt ja nicht die Katze im Sack kaufen

cu

Oliver
Miniaturansicht angehängter Grafiken
durationstr_demo_137.png  
Angehängte Dateien
Dateityp: zip durationstrdemo_128.zip (445,3 KB, 32x aufgerufen)
Dateityp: pas udurationstr_430.pas (9,7 KB, 57x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 15:48
sowas gehört in die CodeLib
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 16:39
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 16:44
und/oder in mein Code-Orakel Online
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 16:51
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

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#6

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 16:54
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 16:59
@Sir Rufo

Die Namensgebung ist Dein Ding

Gruß

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
27. Okt 2009, 17:11
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...
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 17:27
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

edit: const in die Funktionen angefügt, damit der Stack schön klein bleibt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Verbesserte Version von YearsBetween, MonthsBetween

  Alt 27. Okt 2009, 17:45
@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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.
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