function RoundTime(ADate: string; Rounding: Integer; bRound: Boolean): string;
var
Year, Month, Day, Hour, Min, Sec, MSec: Word;
tmpDate: TDateTime;
Res, Diff: string;
M: integer;
begin
tmpDate := StrToDateTime(ADate);
DecodeTime(tmpDate, Hour, Min, Sec, MSec);
if (Rounding > 0) and (bRound = True) thenbeginif Min mod Rounding = 0 then
Res := IntToStr(Min)
else
Res := IntToStr(Round(Min / Rounding) * Rounding);
M := StrToInt(Copy(ADate, Length(ADate) - 1, 2));
Diff := IntToStr(StrToInt(Res) - M);
if Copy(Diff, 1, 1) = '-' thenbegin
Diff := Copy(Diff, 2, Length(Diff) - 1);
Result := FormatDateTime('dd.mm.yy hh:mm', (tmpDate - StrToTime('00:00' + Diff)));
endelse
Result := FormatDateTime('dd.mm.yy hh:mm', (tmpDate + StrToTime('00:00' + Diff)));
endelse
Result := ADate;
end;
// Example: procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := FormatDateTime('dd.mm.yy hh:mm', Now);
Edit2.Text := RountTime(Edit1.Text, SpinEdit1.Value, Checkbox1.Checked);
// Example: RoundTime('07.08.02 10:41', '15', True) -- > 07.08.02 10:45 end;
Программный код на языке Delphi, который реализует функцию RoundTime для округления значений времени. Функция принимает три параметра:
ADate: строка, представляющая дату и время в формате 'dd.mm.yy hh:mm:ss'
Rounding: целочисленное значение,specifying the rounding interval (например, 15 минут, 1 час и т.д.)
bRound: булевый флаг, указывающий, нужно ли округлить время вверх или вниз
Функция выполняет следующие шаги:
Конвертирует строку ADate в объект TDateTime с помощью StrToDateTime.
Разбивает объект TDateTime на его компонентные части (год, месяц, день, час, минута, секунда и миллисекунда) с помощью DecodeTime.
Если Rounding больше 0 и bRound истинно, то округляет минуты до ближайшего кратного значения Rounding. Это делается путем деления минут на Rounding, округления результата до ближайшего целого и умножения его обратно на Rounding.
Вычисляет разницу между округленными минутами и оригинальным значением минуты.
Если разница отрицательна (т.е., округленное время ранее, чем оригинальное), то вычитает разницу из оригинальной даты и времени; в противном случае добавляет разницу к оригинальной дате и времени.
Результатирующую дату и время форматирует как строку с помощью FormatDateTime.
Код также включает пример процедуры, демонстрирующей использование функции RoundTime. В этом случае она берет текущее системное время, округляет его до ближайшего 15-минутного интервала, если чекбокс активен и значение спин-эдита больше 0, и отображает результат в редактируемом контроле.
Некоторые предложения по улучшению кода:
Рассмотрите добавление обработки ошибок для недопустимых входных дат или времени.
Вместо использования StrToDateTime и DecodeTime, можно использовать функцию, похожую на DateTimeFromString, для конвертации строки в объект TDateTime.
Можно упростить логику вычисления разницы между округленными минутами и оригинальным значением минуты, используя арифметические операции вместо конкатенации строк.
Рассмотрите добавление более гибкости для интервала округления, например, возможность указать пользовательский интервал или предоставить варианты для различных типов интервалов (например, секунды, минуты, часы).
Можно улучшить читаемость кода, разбив длинные строки на более короткие и используя постоянное отступ.
В этом коде достигается тот же результат, что и в оригинальной функции, но он более компактен и легче для чтения. Он использует функцию Round для округления минут до ближайшего кратного значения Rounding, а затем вычисляет разницу между округленными минутами и оригинальным значением минуты с помощью арифметических операций. Наконец, он форматирует результатирующую дату и время как строку с помощью FormatDateTime.
Округление времени - статья, которая описывает функцию RoundTime в Delphi, которая округляет время до указанного значения и изменяет дату соответствующим образом.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.