Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Datumsdifferenz in Jahr:Monat:Tag...wie?


SpaghettiCodix - Do 11.11.10 14:19
Titel: Datumsdifferenz in Jahr:Monat:Tag...wie?
Hallo,

ich möchte gern eine Datumsdifferenz so ausgeben daß ich als Ergebnis sowas erhalte:

bis zum XX.XX.XXXX sind es 2 Jahre 4 Monate 8 Tage.

Da gibt es die Funtionen Yearspan und Monthspan.

Bei Monthspan zum Beispiel habe ich die ganzen Monate und eine Nachkommazahl.
Wie kann ich die Nachkommazahl in Tage umrechnen?


bummi - Do 11.11.10 14:31

Dateutils und Handarbeit ;-)


MaxWurzel - Do 11.11.10 14:32

Mit den Funktionen
EncodeDate und
DaysBetween
müsste es gehen.

Edit: Mit EncodeDate wird es doch nicht gehen. Benutze stattdessen IncDay.


jasocul - Do 11.11.10 14:32

Einfach kurz mal aus meiner Erinnerung:
Mach aus der Differenz den Typ TDateTime und benutze die Funktion DecodeDate


SpaghettiCodix - Do 11.11.10 15:07

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Einfach kurz mal aus meiner Erinnerung:
Mach aus der Differenz den Typ TDateTime und benutze die Funktion DecodeDate


Hilfe! Egal wie ich mache, ich kriege hier ein seeehr falsches Ergebnis raus, nämlich:

Die Differenz beträgt: 1900 Jahre 1 Monate 30 Tage

Zitat:

procedure TForm1.Button1Click(Sender: TObject);
var
Datum1, Datum2:TDateTime; //double; //real;
diff:TDateTime; //double; //real;
J,M,T:word;
begin
Datum1:=strtodate('11.11.2010');
Datum2:=strtodate('12.12.2010');
diff:=datum2-datum1;
decodedate(diff,J,M,T);
Label1.caption:= 'Die Differenz beträgt: '+inttostr(J)+' Jahre '+inttostr(M)+'Monate '+
inttostr(T)+' Tage';
end;


jasocul - Do 11.11.10 15:27

Habe ich vergessen.
Delphi hat ein "kleinstes" Datum. Das musst du vom Ergebnis abziehen. Bei den Jahren musst du erstmal 1900 abziehen. Bei den Monaten und Tagen musst du einfach mal nachsehen. Entweder Delphi-Hilfe aufrufen oder ausprobieren für eine Differenz von 0.


SpaghettiCodix - Do 11.11.10 15:57

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Habe ich vergessen.
Delphi hat ein "kleinstes" Datum. Das musst du vom Ergebnis abziehen. Bei den Jahren musst du erstmal 1900 abziehen. Bei den Monaten und Tagen musst du einfach mal nachsehen. Entweder Delphi-Hilfe aufrufen oder ausprobieren für eine Differenz von 0.


Bei Differenz = 0 kommt sowas raus: Differenz 0 ist: 1899 Jahre 12 Monate 30 Tage

sowas geht nicht:
Zitat:

...
{Differenz 0 ist: 1899 Jahre 12 Monate 30 Tage}

Datum1:=strtodate('11.11.2010');
Datum2:=strtodate('13.11.2010');
diff:= datum2-datum1; //diff:=0;
decodedate(diff,J,M,T);
j:=j-1900; m:=m-12; t:=t-30;
...


SpaghettiCodix - Do 11.11.10 16:36

user profile iconMaxWurzel hat folgendes geschrieben Zum zitierten Posting springen:
Mit den Funktionen
EncodeDate und
DaysBetween
müsste es gehen.

Edit: Mit EncodeDate wird es doch nicht gehen. Benutze stattdessen IncDay.


Danke Maxwurzel, Du hast recht, ich habs.

Es sind die Funktionen IncDay und DaysBetween in DateUtils:

Zitat:

procedure TForm1.Button4Click(Sender: TObject);
var
Datum1, Datum2,Neudatum:TDateTime; //double; //real;
Tage:integer;
begin
Datum1:=strtodate('11.11.2010');
Datum2:=strtodate('12.11.2010');
Tage:=DaysBetween(datum1,datum2);
Neudatum:=incDay(now,tage);
Label2.Caption:= datetostr(Neudatum);
end;