特定の 2 つの日付間の営業日数 (営業日) を計算する必要があります。営業日は、土・日を除くすべての曜日です。私はこのカウントに休日を考慮していません。
2 つの日付間の営業日数を計算する方法は?
特定の 2 つの日付間の営業日数 (営業日) を計算する必要があります。営業日は、土・日を除くすべての曜日です。私はこのカウントに休日を考慮していません。
2 つの日付間の営業日数を計算する方法は?
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 は、固定日からの営業日数を計算します。特定の日付は関係ありませんが、1899 年 12 月 25 日月曜日です。単純に経過した週数 (X div 7) をカウントし、それに 5 を掛けます。次に、日付に基づいて補正するオフセットを追加します。週。(X mod 7) は、負の日付、つまり 1899 年 12 月 30 日より前の日付に対して負の値を返すことに注意してください。
ルーチン BusinessDaysBetweenDates は、開始日と終了日に対して BusinessDaysSinceFixedDate を呼び出し、一方を他方から減算します。
すべての日をループせず、順序に依存しないパラメーターを入力します。
Uses DateUtils,Math;
function WorkingDaysBetween( const firstDate,secondDate : TDateTime) : Integer;
var
startDate,stopDate : TDateTime;
startDow,stopDow : Integer;
begin
if (firstDate < secondDate) then
begin
startDate := firstDate;
stopDate := secondDate;
end
else
begin
startDate := secondDate;
stopDate := firstDate;
end;
startDow := DayOfTheWeek(startDate);
stopDow := DayOfTheWeek(stopDate);
if (stopDow >= startDow) then
stopDow := Min(stopDow,6)
else
Inc(stopDow,5);
Result :=
5*WeeksBetween(stopDate,startDate) +
(stopDow - Min(startDow,6));
end;
DayOfTheWeek
(DateUtils
ユニットから) とカウンターを使用して、開始日から終了日まで繰り返す必要があります。(また、休日をカウントから除外するために、おそらく休日の表も必要になるでしょう。)
function BusinessDaysBetween(const StartDate, EndDate: TDateTime): Integer;
var
CurrDate : TDateTime;
begin
CurrDate := StartDate;
Result := 0;
while (CurrDate <= EndDate) do
begin
// DayOfTheWeek returns 1-5 for Mon-Fri, so 6 and 7 are weekends
if DayOfTheWeek(CurrDate) < 6 then
Inc(Result);
CurrDate := CurrDate + 1;
end;
end;
パラメーターの順序を気にしないことで、これを少し拡張できます (つまり、開始が終了の前であっても、終了が開始の前であっても、関数は引き続き機能します)。
function BusinessDaysBetween(const FirstDate, SecondDate: TDateTime): Integer;
var
CurrDate : TDateTime;
StartDate, EndDate: TDateTime;
begin
if SecondDate > FirstDate then
begin
StartDate := FirstDate;
EndDate := SecondDate;
end
else
begin
StartDate := SecondDate;
EndDate := FirstDate;
end;
CurrDate := StartDate;
Result := 0;
while (CurrDate <= EndDate) do
begin
if DayOfTheWeek(CurrDate) < 6 then
Inc(Result);
CurrDate := CurrDate + 1;
end;
end;