Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Zeiten-Addition (https://www.delphipraxis.net/143823-problem-mit-zeiten-addition.html)

DoktorD 24. Nov 2009 09:23


Problem mit Zeiten-Addition
 
Servus.

Also ich habe mich jetzt schon seit mehreren Tagen mit der Addition von Zeiten beschäftigt, und stoße aber immer wieder an meine Grenzen.

Ausgangssituation:
Ich will die komplette Messzeit einer Anlage erfassen. Ich muss es Ablaufbedingt so lösen, dass ich einen String aus einer Datenbank mit der aktuellen Laufzeit bekomme (z.B. 65:55:12 -> 65 Stunden 55 Minuten 12 Sekunden) und dann immer Zeiten dazu addiere.
Dafür habe ich folgende Funktion geschrieben:
Delphi-Quellcode:
function TFrmMain.AddTimes(Time1, Time2: TTime; var TimeSum: TTime): Boolean;
var
  Std, Min, Sec : Integer;
  stdStr, MinStr: String;
  Uebertrag    : Integer;
begin
  Sec := SecondOf(Time1) + SecondOf(Time2);
  Min := MinuteOf(Time1) + MinuteOf(Time2);
  Std := HourOf(Time1)  + HourOf(Time2);

  if (Sec mod 60) > 0 then
  begin
    Sec := Sec mod 60;
    Min := Min + 1
  end;

  if (Min mod 60) > 0 then
  begin
    Min := Min mod 60;
    Std := Std + 1
  end;

  TimeSum := EncodeTime(Std,Min,Sec,0);

  Result := TRUE;
end;
Das Problem ist nun, dass TTime nur maximal 24 Stunden unterstützt und dann gibts Konvertierungsfehler. Nun könnte ich ja alles auf Stringbasis berechnen, aber das wird dann ja immer komplizierter. Wie würdet Ihr das denn lösen?

jfheins 24. Nov 2009 09:32

Re: Problem mit Zeiten-Addition
 
Du könntest entweder mit dem kompletten DateTime arbeiten (hast dann halt noch Tage mit drin) oder die nen eigenen Typen definieren - oder einfach alle Zeiten in Sekunden seit Messbeginn umwandeln (mit Integer kannste dann 68 Jahre in die Zukunft gehen)

himitsu 24. Nov 2009 10:35

Re: Problem mit Zeiten-Addition
 
Wenn in Time wirklich nur Zeiten und kein Datum enthalten ist, dann
Delphi-Quellcode:
function TFrmMain.AddTimes(Time1, Time2: TTime; var TimeSum: TTime): Boolean;
begin
  TimeSum := Time1 + Time2;
  Result := TRUE;
end;
vor dem Komma wären die Tage, statt dem Datum (Datum = Tage seit 30.12.1899)


Delphi-Quellcode:
function TFrmMain.AddTimes(Time1, Time2: TTime; var TimeSum: TTime): Boolean;
var
  Day, Std, Min, Sec: Integer;
begin
  Day := Trunc(Time1)   + Trunc(Time2);
  Sec := SecondOf(Time1) + SecondOf(Time2);
  Min := MinuteOf(Time1) + MinuteOf(Time2);
  Std := HourOf(Time1)  + HourOf(Time2);

  Min := Min + Sec div 60;
  Sec := Sec mod 60;

  Std := Std + Min div 60;
  Min := Min mod 60;

  Day := Day + Std div 24;
  Std := Std mod 24;

  TimeSum := Day + EncodeTime(Std, Min, Sec, 0);

  Result := TRUE;
end;

Luckie 24. Nov 2009 11:15

Re: Problem mit Zeiten-Addition
 
Was bringt eigentlich ein Rückgabewert, der immer wahr ist?

himitsu 24. Nov 2009 11:28

Re: Problem mit Zeiten-Addition
 
k.A., aber vielleicht war mal sowas geplant? :angel2:
Delphi-Quellcode:
...
  Result := Std < 24;
  if Result then TimeSum := EncodeTime(Std,Min,Sec,0);
end;

DoktorD 24. Nov 2009 11:49

Re: Problem mit Zeiten-Addition
 
Den Rückgabewert habe ich erstmal nur so reingemacht, da ich noch am testen bin.

Danke erstmal für Eure Antworten. Aber bei den Lösungen habe ich immer noch das Problem, dass wenn ich den Wert wieder aus der Datenbank auslesen will und dann etwas dazu addieren will, kann ich ihn nicht mehr in TTime umwandeln. Dann müsste ich wieder die Tage und die restliche Zeit trennen.

Die Idee alles in Sekunden umzustellen finde ich bis jetzt am Besten.


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