Delphi. Даты…

На предыдущую страницу…

Среда: Delphi 10.2 Tokyo


Важно! Все (ниже перечисленные) функции ориентированы (если не «сказано» иное) на формат дат: в строковом представлении: ДД.ММ.ГГГГ; в целочисленном представлении: ГГГГММДД.

В процессе формирования…


  • Get_FirstYear_for_Greg — получить самый первый год, корректный для использования функций работы с датами;
  • Get_CountDays_In_Month — вычислить кол-во дней в заданном месяце;
  • IsDateYMD — проверить корректность даты (Год, Месяц, День);
  • DateYMD_to_DateStr — конвертировать Год, Месяц, День (даты) — в строковое представление даты: ДД.ММ.ГГГГ;
  • DateStr_to_DateYMD — конвертировать дату из String (ДД.ММ.ГГГГ) в Year, Month, Day

Const
  MinYear_for_PartialYear = 32; //Значение года, которое трактуется - как после 2000-го года при неполной дате
  sCharsIsSeparatorInDateTime = #9+#32+'.:/\-ю,Ю>'; //разделители, которые могут быть использованы в строковом представлении даты и времени

function Get_FirstYear_for_Greg : integer;
//Получить самый первый год, корректный для использования функций работы с датами
begin
  Result:=1582;
end;

function Get_CountDays_In_Month(Ye, Mo : integer) : integer;
//Вычислить кол-во дней в заданном месяце
begin
  Result:=0;
  if Ye>0 then begin
     if (Mo>0) and (Mo<=12) then begin
        Result:=30;
        if Mo=2 then begin
           Result:=28;
           if SysUtils.IsLeapYear(Ye) then Result:=29;
        end
        else begin
          if (Mo in [1,3,5,7,8,10,12]) then Result:=31;
        end;
      end;
  end;
end;

function IsDateYMD(Ye,Mo,Da : integer) : boolean;
//Проверить корректность даты (Год, Месяц, День) 
{
  Входные параметры:
    Ye - Год (даты),
    Mo - Месяц (даты),
    Da - День (даты).
  Возвращаемое значение: TRUE - дата корректна, FALSE - в противном случае
}
begin
  Result:=false;
  if (Ye>=Get_FirstYear_for_Greg) then begin
     if (Ye<=3100) then begin
        if (Mo>0) and (Mo<=12) then begin
           if (Da>0) then begin
              if (Da<=Get_CountDays_In_Month(Ye,Mo)) then begin
                 Result:=true;
              end;
           end;
        end;
     end;
  end;
end;

function DateYMD_to_DateStr(Ye,Mo,Da : integer; sSep : string = '.') : string;
//Конвертировать Год, Месяц, День - в строковое представление даты: ДД.ММ.ГГГГ
{
  Входные параметры:
    Ye - Год (даты),
    Mo - Месяц (даты),
    Da - День (даты),
    sSep - символ разделитель составных частей даты в строковом представлении.
  Возвращаемое значение: Дата в строковом представлении
}
begin
  Result:='';
  if IsDateYMD(Ye,Mo,Da) then begin
     sSep:=trim(sSep);
     if length(sSep)<=0 then sSep:=DateSeparator_my;
     Result :=   BuildString(IntToStr(Da),2, ORD('0'), 0)
               + sSep
               + BuildString(IntToStr(Mo),2, ORD('0'), 0)
               + sSep
               + BuildString(IntToStr(Ye),4, ORD('0'), 0);
  end;
end;

function DateStr_to_DateYMD(sDate : string; Var Ye,Mo,Da : integer) : boolean;
//Конвертировать дату из String (ДД.ММ.ГГГГ) в Year, Month, Day
Var
  S : string;
  Count999 : integer;
begin
  Result:=false;
  Ye:=0;
  Mo:=0;
  Da:=0;
  sDate:=trim(sDate);
  if length(sDate)>0 then begin
     Count999:=0;
     Da:=Get_Word_From_String_AsInteger(sDate, 1, sCharsIsSeparatorInDateTime, -1);
     if Da>0 then Count999:=Count999+1;
     Mo:=Get_Word_From_String_AsInteger(sDate, 2, sCharsIsSeparatorInDateTime, -1);
     if Mo>0 then Count999:=Count999+1;
     Ye:=Get_Word_From_String_AsInteger(sDate, 3, sCharsIsSeparatorInDateTime, -1);
     if Ye>0 then Count999:=Count999+1;
     if Ye<100 then begin
        if Ye=0 then begin
           //Год нулевой
           if Count999>=3 then Ye:=2000; //если это ДАТА, то кол-во ИЗВЛЕЧЕННЫХ из строки ЧИСЕЛ должно быть не менее 3-х
        end
        else begin
           if Ye<MinYear_for_PartialYear then begin
              Ye:=Ye+2000;
           end
           else begin
              Ye:=Ye+1900;
           end;
        end;
     end;
     Result:=IsDateYMD(Ye,Mo,Da);
  end;
end;



На предыдущую страницу…


Дата: 11.02.2022