Hmmm Schwierigkeiten eigentlich nicht. Man muss nur immer die Grenzen von Tag- und Nachtzeiten anspringen und addieren.
WorkCalc berechnet die Tag- und Nachtzeiten jeweils minutengenau und gibt diese als Stundenwerte zurück. Der Zeitraum kann hierbei auch über mehrere Tage gehen (wer's durchhält).
Delphi-Quellcode:
uses DateUtils;
procedure WorkCalc( const StartTime, EndTime : TDateTime; out DayTime, NightTime : Extended );
var
Time1, Time2 : TDateTime;
IsNight : Boolean;
begin
DayTime := 0;
NightTime := 0;
Time1 := StartTime;
while
( Time1 < EndTime )
do
begin
IsNight := False;
// Wir machen Nachtschicht
if
( FormatDateTime( 'hh:nn:ss', Time1 ) >= '20:00:00' )
then
begin
Time2 := StrToDateTime( DateToStr( IncDay( Time1, 1 ) ) + ' 06:00:00' );
if Time2 > EndTime then
Time2 := EndTime;
IsNight := True;
end;
if
( FormatDateTime( 'hh:nn:ss', Time1 ) < '06:00:00' )
then
begin
Time2 := StrToDateTime( DateToStr( IncDay( Time1, 0 ) ) + ' 06:00:00' );
if Time2 > EndTime then
Time2 := EndTime;
IsNight := True;
end;
if
IsNight
then
begin
NightTime := NightTime + MinutesBetween( Time1, Time2 ) / 60;
end
else
begin
Time2 := StrToDateTime( DateToStr( IncDay( Time1, 0 ) ) + ' 20:00:00' );
if
( EndTime < Time2 )
then
Time2 := EndTime;
DayTime := DayTime + MinutesBetween( Time1, Time2 ) / 60;
end;
Time1 := Time2;
end;
end;
cu
Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)