Получить даты с понедельника по пятницу текущей недели
{
Data sometimes have to be filtered regarding to working
days (Mo.-Fri.) of the current Week. Following procs set
your TDateTimePicker automatically.
}function GetMonday(RefDay: TDate): TDate;
var
DoW: Integer;
DateOffset: Integer;
begin
DoW := DayOfWeek(RefDay);
// Montag der Woche if DoW = 1 then DateOffset := -6
else
DateOffset := Dow - 2;
Result := RefDay - DateOffset;
end;
function GetFriday(RefDay: TDate): TDate;
var
DoW: Integer;
DateOffset: Integer;
begin
DoW := DayOfWeek(RefDay);
{
Friday of current week
Freitag der Woche
}if DoW = 1 then DateOffset := -2
else
DateOffset := Dow - 6;
Result := RefDay - DateOffset;
end;
procedure SetWorkingDaysFilter(S, E: TDateTimePicker);
var
N: TDate;
begin
N := Now;
S.Date := GetMonday(N);
E.Date := GetFriday(N);
end;
{Just as short as simple}{Einfach und kurz}type
TForm1 = class(TForm)
DStart: TDateTimePicker;
DEnd: TDateTimePicker;
btSetFilter: TButton;
procedure btSetFilterClick(Sender: TObject);
end;
procedure TForm1.btSetFilterClick(Sender: TObject);
begin
SetWorkingDaysFilter(DStart, DEnd);
end;
Программный код, предоставленный вами, написан на языке Delphi и используется для фильтрации дат по рабочим дням (понедельник - пятница) текущей недели. Функции GetMonday и GetFriday используются для расчета даты понедельника и пятницы соответственно.
Вот шаг за шагом, как работает код:
Функция GetMonday принимает в качестве входного параметра дату ссылки (RefDay) и рассчитывает дату понедельника той же недели. Она делает это, определив день недели (DoW) с помощью функции DayOfWeek и затем вычитая.offset, основываясь на том, является ли дата ссылки уже понедельником или нет.
Функция GetFriday работает аналогично, но рассчитывает дату пятницы вместо понедельника.
Процедура SetWorkingDaysFilter принимает два компонента TDateTimePicker (S и E) в качестве входных параметров и устанавливает их даты на понедельник и пятницу текущей недели с помощью функций GetMonday и GetFriday.
В коде формы есть событие клика кнопки, которое вызывает процедуру SetWorkingDaysFilter с компонентами TDateTimePicker (DStart и DEnd) в качестве аргументов.
Вот несколько предложений по улучшению кода:
Вместо использования жесткого кодирования дня недели (1 для понедельника, 2 для вторника и т.д.) можно использовать enum или константную переменную, чтобы сделать код более читаемым.
Процедура SetWorkingDaysFilter должна проверять входные даты и убедиться, что они находятся в текущей недели. Это можно сделать, сравнив день недели с первым днем недели (понедельником).
Если вам нужно фильтровать даты по рабочим дням в нескольких неделях, то вам нужно изменить процедуру SetWorkingDaysFilter, чтобы она принимала дополнительный параметр, указывающий на неделю, которую нужно фильтровать.
Вам может также захотеться использовать более эффективный способ расчета даты понедельника и пятницы, например, используя библиотеку для арифметики дат или более сложный алгоритм расчета дат.
В этом примере функции GetMonday и GetFriday используют enum (TDayOfWeek) для представления дней недели. Процедура SetWorkingDaysFilter теперь принимает дополнительный параметр (Week), который указывает на неделю, которую нужно фильтровать (по умолчанию - текущая неделя). Функция использует этот параметр для корректировки расчета дат.
Получить даты с понедельника по пятницу текущей недели с помощью функций GetMonday и GetFriday, а затем установить эти даты в поле ввода для начала и конца периода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.