function BusinessDaysSinceFixedDate (const nDate : tDateTime) : integer;
const
Map : array [ -6 .. 6 ] of integer
= ( 0, 0, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 9);
var
X : integer;
begin
X := trunc (nDate);
Result := 5 * (X div 7) + Map [ X mod 7 ];
end;
function BusinessDaysBetweenDates (const nStartDate : tDateTime;
const nEndDate : tDateTime) : integer;
begin
Result := BusinessDaysSinceFixedDate (nEndDate)
- BusinessDaysSinceFixedDate (nStartDate);
end;
Rutynowe BusinessDaysSinceFixedDate oblicza liczbę dni roboczych od ustalonej daty. Konkretna data, która jest nieistotna, to poniedziałek, 25 grudnia, 1899. Po prostu liczy liczbę tygodni, które minęły (X div 7) i mnoży ją przez 5. Następnie dodaje przesunięcie do poprawienia w oparciu o dzień tygodnia. Zauważ, że (X mod 7) zwróci wartość ujemną dla negatywnej terminie, to znaczy przed datą 30 grudnia 1899.
Rutynowe BusinessDaysBetweenDates prostu wywołuje BusinessDaysSinceFixedDate do daty rozpoczęcia i zakończenia oraz odejmuje jeden od drugiego.
Widzę, dziękuję ... Nie potrzebuję wakacji, ponieważ nie wpłynie to znacząco na czas realizacji, ale weekendy są problematyczne. Dam mu szansę. – Sardukar
Użyłem prawie tej samej funkcji. Świetnie. są też okazy, więc jeśli mało kto ma problemy z wakacjami, to nie wpłynie to na całość ... dziękuję. – Sardukar
Byłoby miło zrobić to bez pętli. –