Вопрос, поднятый пользователем, заключается в необходимости разработки алгоритма для расчета рабочего времени, с учетом различных исключений. Рабочее время представлено интервалом дат, в течение которого необходимо вычесть определенные временные промежутки, не относящиеся к рабочему времени. К таким промежуткам относятся, например, воскресенье в целом, время с 11:00 до 12:00, время после 17:00, время до 8:00 утра и определенные временные слоты в рабочие дни.
Подход к решению
Для решения поставленной задачи можно использовать следующий подход:
Определить начальный и конечный временные промежутки рабочего дня.
Инициализировать переменную для подсчета общего рабочего времени.
Пройти по всем дням в заданном интервале.
Для каждого дня исключить временные промежутки, которые не относятся к рабочему времени.
Подсчитать общее рабочее время, учитывая исключения.
Пример кода
Ниже представлен пример кода на Object Pascal, который реализует данный алгоритм:
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
begin
if DayOfWeek(I) = doSunday then // Проверяем, не воскресенье ли сегодня
Continue; // Если да, то пропускаем этот день
DayStart := Max(Start, I); // Начало рабочего дня
DayFinish := Min(Finish, I + 1 - OneMillisecond); // Конец рабочего дня
Result := Result + DayFinish - DayStart; // Суммируем рабочее время дня
Result := Result - TimeRangeOverlap(DayStart, DayFinish, I + EncodeTime(11,0,0,0), I + EncodeTime(12,0,0,0)); // Вычитаем обеденный перерыв
Result := Result - TimeRangeOverlap(DayStart, DayFinish, I + EncodeTime(17,0,0,0), I + OneDay); // Вычитаем время после 17:00
Result := Result - TimeRangeOverlap(DayStart, DayFinish, I, I + EncodeTime(8,0,0,0)); // Вычитаем время до 8:00 утра
Result := Result - TimeRangeOverlap(DayStart, DayFinish, I + EncodeTime(9,15,0,0), I + EncodeTime(9,30,0,0)); // Вычитаем короткий перерыв
end;
end;
Вывод
Полученная функция TotalTime позволяет вычислить общее рабочее время в минутах, исходя из заданного диапазона дат и времени, с учетом всех исключений, указанных пользователем.
Заключение
Данный пример кода можно использовать как основу для дальнейшей разработки и адаптации под конкретные нужды проекта. Важно помнить, что в реальных рабочих условиях могут возникать дополнительные исключения и правила, которые необходимо будет учитывать.
Вопрос касается разработки алгоритма для расчета рабочего времени в программировании на Delphi с учетом различных исключений, таких как выходные, обеденный перерыв, и нерабочие временные интервалы в течение рабочего дня.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS