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

Получить даты с понедельника по пятницу текущей недели

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

Получить даты с понедельника по пятницу текущей недели


{
  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 используются для расчета даты понедельника и пятницы соответственно.

Вот шаг за шагом, как работает код:

  1. Функция GetMonday принимает в качестве входного параметра дату ссылки (RefDay) и рассчитывает дату понедельника той же недели. Она делает это, определив день недели (DoW) с помощью функции DayOfWeek и затем вычитая.offset, основываясь на том, является ли дата ссылки уже понедельником или нет.
  2. Функция GetFriday работает аналогично, но рассчитывает дату пятницы вместо понедельника.
  3. Процедура SetWorkingDaysFilter принимает два компонента TDateTimePicker (S и E) в качестве входных параметров и устанавливает их даты на понедельник и пятницу текущей недели с помощью функций GetMonday и GetFriday.
  4. В коде формы есть событие клика кнопки, которое вызывает процедуру SetWorkingDaysFilter с компонентами TDateTimePicker (DStart и DEnd) в качестве аргументов.

Вот несколько предложений по улучшению кода:

  • Вместо использования жесткого кодирования дня недели (1 для понедельника, 2 для вторника и т.д.) можно использовать enum или константную переменную, чтобы сделать код более читаемым.
  • Процедура SetWorkingDaysFilter должна проверять входные даты и убедиться, что они находятся в текущей недели. Это можно сделать, сравнив день недели с первым днем недели (понедельником).
  • Если вам нужно фильтровать даты по рабочим дням в нескольких неделях, то вам нужно изменить процедуру SetWorkingDaysFilter, чтобы она принимала дополнительный параметр, указывающий на неделю, которую нужно фильтровать.
  • Вам может также захотеться использовать более эффективный способ расчета даты понедельника и пятницы, например, используя библиотеку для арифметики дат или более сложный алгоритм расчета дат.

В примере кода ниже реализованы эти предложения:

type
  TDayOfWeek = (dMonday, dTuesday, dWednesday, dThursday, dFriday, dSaturday, dSunday);

function GetMonday(RefDay: TDate): TDate;
var
  DoW: Integer;
begin
  DoW := DayOfWeek(RefDay);
  if DoW <= dSaturday then
    Result := RefDay - (7 - Mod(DoW + 1, 7))
  else
    Result := RefDay - (dSunday - DoW);
end;

function GetFriday(RefDay: TDate): TDate;
var
  DoW: Integer;
begin
  DoW := DayOfWeek(RefDay);
  if DoW <= dWednesday then
    Result := RefDay + (dFriday - DoW)
  else
    Result := RefDay + (dSunday - DoW + 2);
end;

procedure TForm1.SetWorkingDaysFilter(S, E: TDateTimePicker; Week: Integer = 0);
var
  N: TDate;
begin
  N := Now;
  if Week > 0 then
    N := N.AddDays(Week * 7);

  S.Date := GetMonday(N);
  E.Date := GetFriday(N);
end;

procedure TForm1.btSetFilterClick(Sender: TObject);
begin
  SetWorkingDaysFilter(DStart, DEnd);
end;

В этом примере функции GetMonday и GetFriday используют enum (TDayOfWeek) для представления дней недели. Процедура SetWorkingDaysFilter теперь принимает дополнительный параметр (Week), который указывает на неделю, которую нужно фильтровать (по умолчанию - текущая неделя). Функция использует этот параметр для корректировки расчета дат.

Получить даты с понедельника по пятницу текущей недели с помощью функций GetMonday и GetFriday, а затем установить эти даты в поле ввода для начала и конца периода.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:17:56/0.0059249401092529/1