gpt4 book ai didi

delphi - 从日期范围中减去Delphi时间范围,计算剩余时间

转载 作者:行者123 更新时间:2023-12-03 18:25:18 28 4
gpt4 key购买 nike

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

例如:

输入日期范围:1/4/2010 11:21 am-1/5/2010 3:00 pm
减去任何部分或完全相交的切片,如下所示:
周日全天删除
非星期日删除11:00-12:00
非星期日的下午5:00后删除时间
非周日,上午8:00之前取消时间
非星期日删除时间9:15-9:30 am
输出:输入日期范围内剩余的分钟数

我不需要任何过于笼统的东西。我可以对规则进行硬编码以简化代码。如果有人知道示例代码或某个地方的库/函数,或者有一些伪代码的想法,那么我很乐意从头开始。例如,我在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;

关于delphi - 从日期范围中减去Delphi时间范围,计算剩余时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588964/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com