У меня есть неотложная задача: в настоящее время я разрабатываю
проект, где я должен проверять достоверность введенных дат с применением маски
__/__/____, например 12/12/1997.
Некоторое время назад я делал простой шифратор/дешифратор дат, проверяющий
достоверность даты. Код приведен ниже.
function CheckDateFormat(SDate: string): string;
var
IDateChar: string;
x, y: integer;
begin
IDateChar := '.,\/';
for y := 1 to length(IDateChar) dobegin
x := pos(IDateChar[y], SDate);
while x > 0 dobegin
Delete(SDate, x, 1);
Insert('-', SDate, x);
x := pos(IDateChar[y], SDate);
end;
end;
CheckDateFormat := SDate;
end;
function DateEncode(SDate: string): longint;
var
year, month, day: longint;
wy, wm, wd: longint;
Dummy: TDateTime;
Check: integer;
begin
DateEncode := -1;
SDate := CheckDateFormat(SDate);
Val(Copy(SDate, 1, pos('-', SDate) - 1), day, check);
Delete(Sdate, 1, pos('-', SDate));
Val(Copy(SDate, 1, pos('-', SDate) - 1), month, check);
Delete(SDate, 1, pos('-', SDate));
Val(SDate, year, check);
wy := year;
wm := month;
wd := day;
try
Dummy := EncodeDate(wy, wm, wd);
except
year := 0;
month := 0;
day := 0;
end;
DateEncode := (year * 10000) + (month * 100) + day;
end;
Текст переведен на русский язык:
Код, предоставленный ниже, является решением на языке программирования Delphi для проверки корректности даты и ее преобразования в числовой формат.
Первая функция CheckDateFormat проверяет, содержит ли входная строка даты любые недопустимые символы (например, запятые, слэши или точки) и заменяет их на тире (-). Это может быть сделано для обеспечения того, чтобы дата была в стандартном формате перед дальнейшей обработкой.
Вторая функция DateEncode принимает форматированную строку даты из CheckDateFormat и разбивает ее на составные части: день, месяц и год. Затем она использует эти значения для создания объекта TDateTime, который представляет собой значение даты и времени. Если дата является недопустимой (например, февраль 30), будет выброшено исключение при попытке создать объект TDateTime. Функция обрабатывает это исключение, установив день, месяц и год в 0, эффективно помечая дату как недопустимую.
Наконец, функция преобразует корректную дату в числовой формат, умножая год на 10000, месяц на 100 и добавляя день. Это результатывает в уникальном численном значении для каждой корректной даты.
Вот улучшенная версия кода:
functionCheckDateFormat(constSDate:string):string;varIDateChar:Char;x,y:Integer;beginResult:=SDate;// Используйте возвращаемый тип напрямуюfory:=1toLength(IDateChar)dobeginx:=Pos(IDateChar[y],SDate);whilex>0dobeginDelete(Result,x,1);Insert('-',Result,x);x:=Pos(IDateChar[y],Result);end;end;end;functionDateEncode(constSDate:string):LongInt;varyear,month,day:LongInt;beginResult:=-1;// Инициализируйте возвращаемое значениеifnotTryStrToDate(Format(SDate,'dd/mm/yyyy'),Dummy)thenExit;// Если дата является недопустимой, выйти из функцииDateEncode:=(Dummy.Year*10000)+(Dummy.Month*100)+Dummy.Day;end;
В этой улучшенной версии:
Функция CheckDateFormat теперь использует возвращаемый тип напрямую вместо присваивания его локальной переменной.
Функция DateEncode была упрощена с помощью функции TryStrToDate, которая более эффективна и читабельна, чем ручное разбиение даты. Если дата является недопустимой, функция сразу выйдет из работы без попытки разбить оставшуюся часть строки даты.
Код можно еще улучшить, добавив обработку ошибок для случаев, когда входная строка даты пуста или содержит только пробельные символы.
В статье описывается созданный шифратор/дешифратор дат, который проверяет достоверность введенных даты в формате '__/__/____' и преобразует ее в код, состоящий из года, месяца и дня.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.