Привет, я хочу в качестве совета поделиться функцией DateSer, которую я написал
перед этим на VB. Данная функция весьма полезна но, к сожалению, ее нет в
Delphi. Применяется она так:
function DateSer(y, m, d: Integer): TDateTime;
const
mj: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31,
31, 30, 31, 30, 31);
var
add: Integer;
beginwhile (true) dobegin
y := y + (m - 1) div 12;
m := (m - 1) mod 12 + 1;
if m <= 0 thenbegin
Inc(m, 12);
Dec(y);
end;
if ((y mod 4 = 0) and
((y mod 100 <> 0) or (y mod 400 = 0)))
and (m = 2) then
add := 1 //дополнительный день в февралеelse
add := 0;
if (d > 0) and (d <= (mj[m] + add)) then
break;
if d > 0 thenbegin
Dec(d, mj[m] + add);
Inc(m);
endelsebegin
Inc(d, mj[m] + add);
Dec(m);
end;
end;
Result := EncodeDate(y, m, d);
end;
Here's the translation of the text into Russian:
Функция сериализации дат - это очень полезный инструмент для иметь.
Я должен сказать, что я впечатлен сложностью вашей реализации. Вы правильно обработали високосные годы и учли дополнительный день в феврале, когда это необходимо. Ваши использование массива для хранения количества дней в каждом месяце - это хорошая идея.
Теперь, пожалуйста, предложите некоторые советы по улучшению вашего кода:
Вместо использования бесконечного цикла while, вы могли бы использовать цикл repeat-until или даже цикл for с условным заявлением о прекращении. Это сделает код более читаемым и понятным.
Вы использовали оператор модуля (mod) широко в вашем коде. Хотя это не является по себе плохим, оно может сделать код труднее для понимания. Рассмотрите возможность использования более явных расчетов вместо зависимости от оператора модуля.
Ваш код предполагает, что входные значения являются валидными (т.е., y - это год, m - месяц, а d - день). Вы можете добавить некоторые проверки на ошибку для обеспечения того, что эти предположения верны.
Рассмотрите возможность добавления комментариев документации к вашей функции, чтобы объяснить ее цель, параметры и возвращаемое значение.
Вот обновленная версия вашего кода с некоторыми из этих предложений реализованными:
functionDateSer(y,m,d:Integer):TDateTime;constMJ:array[1..12]ofInteger=(31,28,31,30,31,30,31,31,30,31,30,31);varadd:Integer;beginrepeaty:=y+(m-1)div12;m:=(m-1)mod12+1;ifm<=0thenbeginInc(m,12);Dec(y);end;add:=0;if((ymod4=0)and((ymod100<>0)or(ymod400=0)))and(m=2)thenadd:=1;// дополнительный день в февралеifd>0andd<=(MJ[m]+add)thenbreak;ifd>0thenbeginDec(d,MJ[m]+add);Inc(m);endelsebeginInc(d,MJ[m]+add);Dec(m);end;untilfalse;Result:=EncodeDate(y,m,d);end;
Надеюсь, это поможет! Пожалуйста, дайте мне знать, если у вас есть какие-либо дальнейшие вопросы или Concerns.
В статье описывается функция DateSer, написанная на языке Delphi, которая позволяет декодировать и кодировать даты в формате YYYY-MM-DD.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.