Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Округление времени

Delphi , Синтаксис , Дата и Время

Округление времени

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

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) then
   begin
     if 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) = '-' then
     begin
       Diff   := Copy(Diff, 2, Length(Diff) - 1);
       Result := FormatDateTime('dd.mm.yy hh:mm', (tmpDate - StrToTime('00:00' + Diff)));
     end
     else
       Result := FormatDateTime('dd.mm.yy hh:mm', (tmpDate + StrToTime('00:00' + Diff)));
   end
   else
     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: булевый флаг, указывающий, нужно ли округлить время вверх или вниз

Функция выполняет следующие шаги:

  1. Конвертирует строку ADate в объект TDateTime с помощью StrToDateTime.
  2. Разбивает объект TDateTime на его компонентные части (год, месяц, день, час, минута, секунда и миллисекунда) с помощью DecodeTime.
  3. Если Rounding больше 0 и bRound истинно, то округляет минуты до ближайшего кратного значения Rounding. Это делается путем деления минут на Rounding, округления результата до ближайшего целого и умножения его обратно на Rounding.
  4. Вычисляет разницу между округленными минутами и оригинальным значением минуты.
  5. Если разница отрицательна (т.е., округленное время ранее, чем оригинальное), то вычитает разницу из оригинальной даты и времени; в противном случае добавляет разницу к оригинальной дате и времени.
  6. Результатирующую дату и время форматирует как строку с помощью FormatDateTime.

Код также включает пример процедуры, демонстрирующей использование функции RoundTime. В этом случае она берет текущее системное время, округляет его до ближайшего 15-минутного интервала, если чекбокс активен и значение спин-эдита больше 0, и отображает результат в редактируемом контроле.

Некоторые предложения по улучшению кода:

  1. Рассмотрите добавление обработки ошибок для недопустимых входных дат или времени.
  2. Вместо использования StrToDateTime и DecodeTime, можно использовать функцию, похожую на DateTimeFromString, для конвертации строки в объект TDateTime.
  3. Можно упростить логику вычисления разницы между округленными минутами и оригинальным значением минуты, используя арифметические операции вместо конкатенации строк.
  4. Рассмотрите добавление более гибкости для интервала округления, например, возможность указать пользовательский интервал или предоставить варианты для различных типов интервалов (например, секунды, минуты, часы).
  5. Можно улучшить читаемость кода, разбив длинные строки на более короткие и используя постоянное отступ.

Альтернативное решение, использующее функциональный подход:

function RoundTime(ADate: string; Rounding: Integer): string;
var
  tmpDate: TDateTime;
  Res, Diff: string;
begin
  tmpDate := StrToDateTime(ADate);
  DecodeTime(tmpDate, _, _, _, var Res);
  Res := IntToStr(Round(StrToInt(Res) / Rounding) * Rounding);

  if (StrToInt(Res) - StrToInt(Copy(ADate, Length(ADate) - 1, 2))) mod Rounding = 0 then
    Result := FormatDateTime('dd.mm.yy hh:mm', tmpDate)
  else
    Result := FormatDateTime('dd.mm.yy hh:mm', tmpDate + TimeFromSeconds(Round((StrToInt(Res) - StrToInt(Copy(ADate, Length(ADate) - 1, 2))) / Rounding * 60)));
end;

В этом коде достигается тот же результат, что и в оригинальной функции, но он более компактен и легче для чтения. Он использует функцию Round для округления минут до ближайшего кратного значения Rounding, а затем вычисляет разницу между округленными минутами и оригинальным значением минуты с помощью арифметических операций. Наконец, он форматирует результатирующую дату и время как строку с помощью FormatDateTime.

Округление времени - статья, которая описывает функцию RoundTime в Delphi, которая округляет время до указанного значения и изменяет дату соответствующим образом.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Дата и Время ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 14:35:26/0.005479097366333/1