我在寻找一种算法,这将有助于计算工作日的工作时间长度。这将有一个输入的日期范围,然后允许减去部分或从该时间范围完全相交时间范围切片,其结果将是分钟中剩余的原始日期范围的数量(或在一天的馏分/多个),减法后出的各种非工作时间片。

例如:

输入日期范围:1/4/2010上午11时21 - 2010年1月5日下午3点00,点击 减去任何部分或完全相交片这样的:点击 删除周日全天结果 非周日删除11:00 - 12:00点击 下午5:00结果后非周日删除时间 上午8:00结果之前非周日删除时间 非周日删除时间9:15 - 9:30结果 输出:分钟的#留在输入日期范围

我什么都不需要过于一般。我可以硬编码规则来简化代码。如果有人知道的样本代码或库/函数的地方,或者有一些伪代码的想法,我喜欢的东西开始。我没有看到任何DateUtils,例如。即使是计算在两个日期范围重叠的分钟数基本功能到减去将是一个好的开端。

有帮助吗?

解决方案

有趣的需要...但不是很难实现的“硬编码”的方式。

享受

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周小时的时间的)。

的范围内

真的提供任何更多的详细的“纲要”一个还不如实现完整的程序给你,而如果我有更多的时间我可以做,这不幸的是我做的不是现在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top