Среда: 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