Moin, Moin
@ibp ... Nicht ganz richtig !
Wenn ich das Datum zur Verfügung habe geht das natürlich so in Ordnung und sogar noch einfacher, aber darüber stand nichts in der Frage. O.g. Beispiel sollte nur den 'Weg' aufzeigen. Der OP wollte lediglich Aufklärung wie er die Differenz von 2 Uhrzeiten richtig ermitteln kann. Ermitteln deswegen, weil errechnen durch einfache Subtraktion scheidet ja wohl aus !!
Beim rechnen mit Uhrzeiten ohne Datum muss man einfach dem Datumssprung Rechnung tragen !!
Selbst wenn ich zur Uhrzeit das Datum seperat mit einfüge, muss ich trotzdem - ob es Dir passt oder nicht - dafür Sorge tragen das das Ende.Datum um einen Tag höher liegt als das Start.Datum.
Sprich: Ende.Zeit < Start.Zeit = (Ergebnis.Zeit + 24 Stunden) ...
bei folgender Function gehts mit oder ohne Datum:
Delphi-Quellcode:
Function TimeDif(Start, Ende: TDateTime): TTime;
var H, M: Integer;
R: Real;
begin
if Start > Ende then
Ende:= IncDay(Ende);
R:= HourSpan(Start,Ende);
H:= Round(Int(R)); // Stunden
M:= Round(Frac(R)* 60); // Minuten
if M = 60 then begin // aus 60 Min wird 1 volle Stunde
M:= 0;
Inc(H);
end;
Result:= StrToTime(Format('%d:%.2d',[H, M]));
end;
... und der Aufruf wie folgt:
Delphi-Quellcode:
var ABeg, AEnd: TTime;
Saz: TTime;
Iaz: TTime;
S: String;
begin
ABeg:= StrToTime('8:00'); // ArbeitsBeginn
AEnd:= StrToTime('16:00'); // ArbeitsEnde
Saz:= StrToTime('8:30'); // Soll-Arbeitszeit
Iaz:= TimeDif(ABeg, AEnd); // Ist-Arbeitszeit
if Iaz > Saz then // Soll erfüllt ? = Überzeit
S:= 'Überzeit ' + FormatDateTime('t', TimeDif(Saz, Iaz))
else // sonst RestArbeitszeit
S:= 'Rest '+ FormatDateTime('t', TimeDif(Iaz, Saz));
ShowMessage('ArbZeit '+ FormatDateTime('t', ABeg)+ ' - '+
FormatDateTime('t', AEnd)+ #10#13#13+
'Az (Soll) '+ FormatDateTime('t', Saz)+ #10#13+
'Az (Ist) '+ FormatDateTime('t', Iaz)+ #10#13+
S);
end;
Gruss Mario