Ich benötige derartige Funktionen eigentlich immer nur in Datenbanken für Massenkalkulationen, ich habe den komplizierteren Teil der Zuschlagsfindung mal exemplarisch für Delphi skizziert
Delphi-Quellcode:
uses Math;
{$R *.dfm}
Function GetLappingHours(von1,bis1,von2,bis2:TDateTime):TdateTime;
var
von,bis:TDateTime;
begin
Result := 0;
If (bis1>von2) and (bis1 <bis2) or ((von1>von2) and (von1<bis2)) or ((von1<=von2) and (bis1>=bis2)) then
begin
if Von1 >Von2 then Von := Von1 else Von := Von2;
if Bis1 < Bis2 then Bis := Bis1 else Bis := Bis2;
Result := RoundTo((Bis - Von) * 24,-2);
end
end;
procedure TForm2.Button1Click(Sender: TObject);
var
v1,b1,v2,b2:TdateTime;
begin
v1 := StrToDateTime('01.01.2012 12:00');
b1 := StrToDateTime('01.01.2012 20:12');
v2 := Trunc(v1) + StrToTime('18:00');
b2 := Trunc(v2) + StrToDateTime('23:00');
Caption := 'Stunden mit Zuschlag x%=' + FloatToStr(GetLappingHours(v1,b1,v2,b2));
end;
Generell würde ich mit TDatetimes arbeiten, ob in Array,Listen oder Tabellen ..
Zeit=Bis-Von Vorkommateil entspricht Tagen
(wobei Delphi bei der Darstellung als Datum bei 30.12.1899 beginnt ( Caption := DateToStr(0)
was für die Rechnerei aber unerheblich ist)
Der Nachkommateil ist ebenfalls in Tagen zu interpretieren, also 0.5=12:00 etc.