Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Differenz zwischen Datum / Uhrzeit (https://www.delphipraxis.net/82927-differenz-zwischen-datum-uhrzeit.html)

Uncle Cracker 22. Dez 2006 11:03


Differenz zwischen Datum / Uhrzeit
 
Guten Morgen,

ich habe jetzt schon das ganze Forum durchsucht und auch einiges gefunden und zusammengebastelt, aber egal wie ich es mache, es werden immmer Fehler erzeugt und ich weiß einfach nicht warum :(

Ich versuche schon die ganze Zeit die Differenz zwischen zwei Daten zu ermitteln, aber entweder der Monat stimmt nicht oder das Jahre. Die beiden Daten werden normal mit DecodeDate und DecodeTime verglichen, aber es stimmt einfach nicht :/

Hier mal mein Quelltext:

Delphi-Quellcode:
function InJahren(const Damals, Heute: TDateTime): Integer;
var
   DamalsTag, DamalsMonat, DamalsJahr: Word;
   HeuteTag, HeuteMonat, HeuteJahr: Word;
begin
  if Heute < Damals then
  begin
     Result := -1
  end
  else
  begin
    DecodeDate (Damals, DamalsJahr, DamalsMonat, DamalsTag);
    DecodeDate (Heute, HeuteJahr, HeuteMonat, HeuteTag);
    Result := HeuteJahr - DamalsJahr;
    if (HeuteMonat <= DamalsMonat) and (HeuteTag < DamalsTag) then
    begin
      Dec (Result);
    end;
  end;
end;

function diff(Datum: TDateTime): string;
var
    Differenz, jetzt: TDateTime;
    jahre, monate, tage, h, m, s, ms : Word;
begin
  result := '';
  jetzt := Now;
  Differenz := jetzt - Datum;
  DecodeDate(Differenz, jahre, monate, tage);
  if MonthsBetween(jetzt, Datum) {DaysBetween(jetzt, Datum)} <> 0 then
    monate := monate - 1
  else
    monate := 0;
  jahre := InJahren(Datum, Now);
  DecodeTime (Differenz, h, m, s, ms);
  if Jahre <> 0 then result := InttoStr(Jahre) + ' Jahre ';
  if Monate <> 0 then result := result + InttoStr(Monate) + ' Monate ';
  if tage <> 0 then result := result + InttoStr(tage) + ' Tage ';
  if h <> 0 then result := result + InttoStr(h) + ' Stunden ';
  if m <> 0 then result := result + InttoStr(m) + ' Minuten ';
  if s <> 0 then result := result + InttoStr(s) + ' Sekunden ';
end;
Die Funktion InJahren ist eine Funktion, die ich hier im Forum gefunden habe, um die Jahre zu bestimmen...

Also, es wird Datum / Uhrzeit als Paramter im folgenden Format eingegeben '05.10.2002 01:00:12' und wird dann mit dem aktuellen Datum / Uhrzeit verglichen und als Ergebnis soll die Differenz in Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden ausgegeben werden, jedoch funktioniert es nicht immer, da die Funktion z.B. am selben Tag nur ein wenig früher "30 Tage" ausgibt, jedoch bei einem Monat vorher den korrekten Wert und verstehe einfach nicht wieso :?

Hat vielleicht jemand einen Vorschlag, der funktioniert oder einen komplett anderen Ansatz?
Toll wäre natürlich auch, wenn ich anstatt der Monate, die Wochen angeben könnte...


:love: Thx UC

fLaSh11 22. Dez 2006 11:08

Re: Differenz zwischen Datum / Uhrzeit
 
wie wäre es, wenn du einfach das Datum in Sekunden umwandelst, diese voneinander subtrahierst und das Ergebnis dann wieder umwandelst in ein Datum?

Uncle Cracker 22. Dez 2006 12:39

Re: Differenz zwischen Datum / Uhrzeit
 
Zitat:

Zitat von fLaSh11
wie wäre es, wenn du einfach das Datum in Sekunden umwandelst, diese voneinander subtrahierst und das Ergebnis dann wieder umwandelst in ein Datum?

Öhhhmmm...wie soll ich eine Konstante in Sekunden umwandeln? Kann mir grad nicht so vorstellen, wie das gehen soll, hättest du nen Beispiel oder so!?

Phoenix 22. Dez 2006 13:02

Re: Differenz zwischen Datum / Uhrzeit
 
Zitat:

Zitat von Uncle Cracker
Öhhhmmm...wie soll ich eine Konstante in Sekunden umwandeln? Kann mir grad nicht so vorstellen, wie das gehen soll, hättest du nen Beispiel oder so!?

Wieso Konstante?
Ein TDateTime ist nix anderes als ein Double. Im Ganzzahligen Anteil steckt das Datum, im Nachkommawert die Uhrzeit.

Das Bedeutet:
TDateTime(now) - TDateTime(irgendwann) => TDateTime(Differenz) bzw. Double(Differenz).

Integer(Double(Differenz)) = Anzahl der Tage dazwischen. Also Integer(Differenz) / 365 = Anzahl der Jahre. Okay, etwas ungenau wenns genau an der Jahresgrenze ist vor allem bei Schaltjahren, aber die lassen sich ja aus den beiden Jahreszahlen genau ermitteln.

Balu der Bär 22. Dez 2006 13:05

Re: Differenz zwischen Datum / Uhrzeit
 
Schonmal versucht die beiden Daten mittels Delphi-Referenz durchsuchenSecondsBetween zu vergleichen und das Ergebnis dieser Operation dann in Minuten / Stunden / Tage / Monate / Jahre umzuwandeln (ist praktisch derselbe Vorschlag wie von flash11, nur das Umwandeln in Sekunden kann man sich sparen)?

Klaus01 22. Dez 2006 13:58

Re: Differenz zwischen Datum / Uhrzeit
 
Ein Zeitdifferenz in Monaten zu zerteilen ist gerade nicht eine sehr gute Idee.
Warum? Weil der Monat keine feste Zeiteinheit ist.
Der Monat Februar ist schließlich um eniges kürzer als der Monat August.

Grüße
Klaus

Uncle Cracker 22. Dez 2006 14:12

Re: Differenz zwischen Datum / Uhrzeit
 
Zitat:

Zitat von Klaus01
Ein Zeitdifferenz in Monaten zu zerteilen ist gerade nicht eine sehr gute Idee.
Warum? Weil der Monat keine feste Zeiteinheit ist.
Der Monat Februar ist schließlich um eniges kürzer als der Monat August.

Grüße
Klaus

Dann müsste doch aber alles, was über dem Monat steht auch keine Festzeiteinheit mehr sein bzw. mann könnte es dann nicht mehr so einfach berechnen oder?

Schließlich würde dann bei der Berechnung des Jahres 365 als fester Wert gesetzt werden oder eben die Schaltjahrberechnung mit reinkommen und eventuell mit 366 Tagen gerechnet werden oder!?

Klaus01 22. Dez 2006 14:21

Re: Differenz zwischen Datum / Uhrzeit
 
Zitat:

der Berechnung des Jahres 365 als fester Wert gesetz
Wohl eher 365.25 Tage, da alle 4 Jahre ein Schaltjahr ist.

Hier gab es schonmal ein bis zwei solcher Diskussionen.


Grüße
Klaus

Uncle Cracker 22. Dez 2006 14:45

Re: Differenz zwischen Datum / Uhrzeit
 
Also ich habs jetzt so probiert, dass ich den Monat rausgenommen habe und stattdessen Wochen, aber irgendwie häng ich noch am selben Problem...

Solange es 0 Jahre sind, ist alles kein Problem, doch ab einem Jahr wird das Jahr mit angezeigt, jedoch zählen die Wochen weiterhin hoch, z.B. 19 Jahre, 955 Wochen,...
Ich weiß aber auch nicht wie ich es verhindern kann, da ich nicht weiß ob ich nun durch 52 oder 53 Teilen muss :/

So sieht man aktueller Quelltext dazu aus:

Delphi-Quellcode:
function diff(Datum: TDateTime): string;
var
    Differenz, jetzt: TDateTime;
    jahre, monate, tage, h, m, s, ms, woche: Word;
begin
  result := '';
  jetzt := Now;
  Differenz := jetzt - Datum;
  jahre := InJahren(Datum, Now);
  woche := WeeksBetween(jetzt, Datum);
  DecodeTime (Differenz, h, m, s, ms);
  tage := Trunc(Differenz);
  if woche <> 0 then
    tage := tage mod 7;
  if Jahre <> 0 then result := InttoStr(Jahre) + ' Jahre ';
  if woche <> 0 then result := result + InttoStr(woche) + ' Woche ';
  if tage <> 0 then result := result + InttoStr(tage) + ' Tage ';
  if h <> 0 then result := result + InttoStr(h) + ' Stunden ';
  if m <> 0 then result := result + InttoStr(m) + ' Minuten ';
  if s <> 0 then result := result + InttoStr(s) + ' Sekunden ';
end;
Wäre gut wenn mir noch jemand helfen könnte, dass mit den Sekunden hochrechnen bekomme ich irgendwie ni so ganz hin, daher hänge ich immer noch an meinem eigenen Quelltext :D

marabu 22. Dez 2006 15:04

Re: Differenz zwischen Datum / Uhrzeit
 
Hallo,

hast du keinen Zugriff auf die Routinen YearsBetween() und WeeksBetween() aus der Unit DateUtils?

Vielleicht solltest du deine Delphi-Version in deinem DP-Profil eintragen...

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 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