Работа с датами и временем
Работа с временными величинами в 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
- Подробности
- Родительская категория: Работа с датами и временем
- Категория: Математика времени и временные интервалы
Страница 7 из 10