12

特定の 2 つの日付間の営業日数 (営業日) を計算する必要があります。営業日は、土・日を除くすべての曜日です。私はこのカウントに休日を考慮していません。

2 つの日付間の営業日数を計算する方法は?

4

3 に答える 3

14
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 を呼び出し、一方を他方から減算します。

于 2013-02-13T16:43:42.223 に答える
12

すべての日をループせず、順序に依存しないパラメーターを入力します。

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;
于 2013-02-13T14:50:40.197 に答える
9

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;
于 2013-02-13T02:15:11.897 に答える