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