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;
Процедура BusinessDaysSinceFixedDate вычисляет количество рабочих дней с фиксированной датой. Конкретная дата, которая не имеет значения, - понедельник, 25 декабря, 1899. Он просто подсчитывает количество прошедших недель (X div 7) и умножает их на 5. Затем он добавляет смещение, чтобы исправить в зависимости от дня недели. Заметим, что (Х мод 7) будет возвращать отрицательное значение для отрицательного дату, т.е. дату до 30 декабря, 1899.
В рутинные BusinessDaysBetweenDates просто вызывает BusinessDaysSinceFixedDate для начальной и конечной даты и вычитает одно от другого.
Я вижу, спасибо ... Мне не нужны праздники, так как они не будут сильно влиять на время поворота ... но выходные - проблема. Я сделаю это. – Sardukar
Я использовал почти ту же функцию. Отлично работает. есть также и образцы, поэтому, если у некоторых из них есть проблемы с праздниками, они не повлияют на общее. – Sardukar
Было бы неплохо сделать это без цикла. –