Работа с временными величинами в Delphi очень проста, если пользоваться встроенными функциями преобразования. Определите глобальные Hour, Minute, Second и инициализируйте их следующим образом:

 

Code:

Hour := EncodeTime(1,0,0,0);

Minute := EncodeTime(0,1,0,0);

Second := EncodeTime(0,0,1,0);

 

Или, если вы предпочитаете константы, сделайте так:

 

Code:

Hour = 3600000/MSecsPerDay;

Minute = 60000/MSecsPerDay;

Second = 1000/MSecsPerDay;

 

Теперь для того, чтобы добавить 240 минут к переменной TDateTime, просто сделайте

 

T := T + 240*Minute;

 https://delphiworld.narod.

DelphiWorld 6.0

 

 


 

Есть более простой путь для работы с датой и временем чем прибегать к функциям зашитым в DateUtil. На самом деле тип TDateTime является обычным real - числом с плавающей точкой, который содержит количество дней прошедших с 30 декабря 1899 года (под Windows) или с 1 января 1900 года под Linux. Таким образом целая часть - есть дни. Чтобы взять дату днём позже достаточно просто прибавить 1, неделей позже - прибавить 7. Дробная часть даты это время, причём в днях, т.е. 1 час это 1/24 или 0.0416(6), 1 минута будет равна 1/(24*60), а одна секунда соответственно 1/(24*3600). Ну дальше всё просто... не сложнее арифметики за 3 класс очень средней школы...

 

Code:

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 = 0then

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;

 

Тип TDateTime, используемый для передачи даты и времени, это тип double, у которого целая часть определяет день, а дробная время от полуночи. То есть, если прибавить ко времени 1, то дата изменится на один день, а время не изменится. Если прибавить 0.5, то прибавится 12 часов. Причем этот метод работает даже в том случае, когда меняется дата, месяц или год.

 

 

Code:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Label1.Caption := DateTimeToStr(Time);

Label2.Caption := DateTimeToStr(Time + 1 / 24);

end;

Code:

{ **** UBPFD *********** by delphibase.endimus****

>> Получение целого числа часов от начала суток

 

Возвращает целое число часов от начала суток.

Пример: для "11:25:00" будет возвращено значение "11"

 

Зависимости: System, SysUtils

Автор: savva, savvanm.ru, ICQ:126578975, Орел

Copyright: Сапронов Алексей (Savva)

Дата: 6 июня 2002 г.

***************************************************** }

 

function GetСurrentHour: integer;

begin

result := Round(Time * 24);

end;

Автор: Hans Pieters

 

Если Вы создаёте приложение, в котором пользователь вводит значения времени, то стандартные вычисления не подойдут. Проблема в том, что нужно сделать так, чтобы выражение 1.20 + 1.70 было равно НЕ 2.90 а 3.10.

Здесь представлены три функции, которые решают эту проблему. Они работают только с часами и минутами, потому что пользователь очень редко используют секунды, но если Вам потребуются секунды, то Вы без труда сможете доработать эти функции по своему желанию. Вторая и третья функции позволяют преобразовать реальное значение времени в десятичный эквивалент и обратно. Все поля на форме будут в формате hh.mm.

 

Code:

 

function sumhhmm(a, b: double): double;

var

h1: double;

begin

h1 := (INT(A) + INT(B)) * 60 + (frac(a) + frac(b)) * 100;

result := int(h1 / 60) + (h1 - int(h1 / 60) * 60) / 100;

end;

 

function hhmm2hhdd(const hhmm: double): double;

begin

result := int(hhmm) + (frac(hhmm) / 0.6);

end;

 

function hhdd2hhmm(const hhdd: double): double;

begin

result := int(hhdd) + (frac(hhdd) * 0.6);

end;

 

 

Использование:

// sumtime(1.20,1.50) => 3.10

// sumtime(1.20,- 0.50) => 0.30

// hhmm2hhdd(1.30) => 1.5 (1h.30m = 1.5h)

// hhdd2hhmm(1.50) => 1.30 (1.5h = 1h30m)

 

 

Взято из https://forum.sources