Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как учесть исключения в расчете продолжительности рабочего времени в программировании на Delphi

Delphi , Синтаксис , Дата и Время

Вопрос, поднятый пользователем, заключается в необходимости разработки алгоритма для расчета рабочего времени, с учетом различных исключений. Рабочее время представлено интервалом дат, в течение которого необходимо вычесть определенные временные промежутки, не относящиеся к рабочему времени. К таким промежуткам относятся, например, воскресенье в целом, время с 11:00 до 12:00, время после 17:00, время до 8:00 утра и определенные временные слоты в рабочие дни.

Подход к решению

Для решения поставленной задачи можно использовать следующий подход:

  1. Определить начальный и конечный временные промежутки рабочего дня.
  2. Инициализировать переменную для подсчета общего рабочего времени.
  3. Пройти по всем дням в заданном интервале.
  4. Для каждого дня исключить временные промежутки, которые не относятся к рабочему времени.
  5. Подсчитать общее рабочее время, учитывая исключения.

Пример кода

Ниже представлен пример кода на 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Дата и Время ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 14:56:05/0.0052239894866943/1