質問

私は平日作業時間の長さを計算するのに役立ちますアルゴリズムを探しています。これは、入力日付の範囲を有し、その日付範囲から部分的または完全に交差する時間範囲スライスを減算可能と結果が分数(又は日の分数/複数)であろう差し引いた後、元の日付範囲内に残さなります様々な非ワーキングタイムスライス出ます。

例:

入力した日付範囲:2010年1月4日11:21 - 2010年1月5日午後3時の
このような任意の部分的または完全に交差するスライスを引きます。
日曜日の終日
を削除します 非日曜日削除午前11時00 - 12時
非日曜日削除時間午後5:00
後 非日曜日削除時間午前8時前に
非日曜日リムーブ時間午前9時15分 - 午前9:30
出力:入力した日付範囲内に残っ分の#

私は過度に一般的な何かをする必要はありません。私は、コードを簡素化するために、ルールをハードコーディングできます。誰もがサンプルコードやライブラリ/機能のどこかを知っている、またはいくつかの擬似コードのアイデアを持っている場合、私は開始するために何かをしてみたいです。私は、例えば、DateUtilsには何も表示されませんでした。アウト引くために、2つの日付の範囲内の重複分の数を計算しても、基本的な機能は良いスタートになります。

役に立ちましたか?

解決

興味深い要件...しかし、「ハードコード」の方法で達成することはそれほど難しいことではありません。

タグをお楽しみください
uses
  Math, DateUtils;

function TimeRangeOverlap(Range1Start, Range1Finish, Range2Start, Range2Finish : TDateTime) : TDateTime;
begin
  Result := Max(Min(Range1Finish, Range2Finish) - Max(Range1Start, Range2Start), 0);
end;

function TotalTime(Start, Finish : TDateTime) : TDateTime;
var DayStart, DayFinish : TDateTime;
    I : Integer;
begin
  Result := 0;
  for I := Floor(Start) to Floor(Finish) do  //For each day in range;
  begin
    if DayOfWeek(I) = 1 then CONTINUE; //Remove all sundays.

    DayStart := Max(Start, I);     //Midnight on the start of the day, except on the first day;
    DayFinish   := Min(Finish, I + 1 - OneMillisecond); //Midnight minus 1 msec of the following day.

    Result := Result + DayFinish - DayStart;

    //Adjustment part
    Result := Result - TimeRangeOverlap(DayStart, DayFinish, I + EncodeTime(11,00,00,00), I + EncodeTime(12,00,00,00)); //Remove time between 11:00 and 12:00
    Result := Result - TimeRangeOverlap(DayStart, DayFinish, I + EncodeTime(17,00,00,00), I + 1); //Remove time after 5:00 PM
    Result := Result - TimeRangeOverlap(DayStart, DayFinish, I                          , I + EncodeTime(8,00,00,00)); //Remove time after 8:00 AM
    Result := Result - TimeRangeOverlap(DayStart, DayFinish, I + EncodeTime(9,15,00,00), I + EncodeTime(9,30,00,00)); //Remove time between 9:15 and 9:30
  end;
end;

他のヒント

単にDateUtilsでルーチンを使用し、他の場所で、あなた自身が記述ルールを実装します。

あなたはカフオフ、あなたが始めるためのアイデアをしたい場合、私はあなたの入力範囲の分を計算することをお勧めしたい(TDateTime値が積分値が日数と小数部分である浮動小数点であることを思い出しその後範囲スルー増分各整数工程(日)のためにあなたのルールとの最初/最後の日の開始/終了時間に基づいて合計からその日の分の適切な数を減算日の部分)であります当時は、範囲内で遭遇されている範囲(もちろん、完全な24時間の期間のもの日を介在)。

本当に任意のより詳細な「アウトライン」1つのかもしれないを提供するだけでなく、私はより多くの時間を持っていた場合、私は悲しいことに、私は今、そうでない、やるかもしれない、あなたのための完全なルーチンを実装します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top