IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Сравнение времени в Delphi (http://www.imho.ws/showthread.php?t=77000)

mrac 05.01.2005 04:28

Сравнение времени в Delphi
 
Поставлена такая задача: в программе задается временной промежуток От: (ЧЧ:ММ)
До: (ЧЧ:ММ)
Программа должна в данном промежутке времени каждую секунду выполнять некое действие. Как реализовать корректное сравнение времени, учитывая все комбинации временных промежутков?
Например для:
от 13:15 до 17:10
от 15:00 до 00:00
от 15:15 до 14:20
от 13:10 до 13:15
??
Помогите пожалуйста, замучался уже с if..then :(

chesnok 05.01.2005 11:11

GetTickCount в начале промежутка и в конце. А размер Tick'а узнать - GetSystemTimeAdjustment. За подробдностями - msdn.microsoft.com

Ghost 05.01.2005 11:50

mrac
А почему бы не воспользоваться дмумя таймерами:
1 - каждую секунду проверяет текущее время на принадлежность указанному промежутку и включает/выключает в зависимости от этого второй таймер.
2 - каждую секунду выполняет нужное действие.
В принципе, можно проверку в первом таймере делать и не каждую секунду, а вычислять ее в зависимости, опять-таки, от разницы между текущим временем и началом данного промежутка.
А текущее время определить просто:
Код:

var
  DateTime: TDateTime;
  str: string;
  hour, min, sec: integer;
...
  DateTime := Time;
  str  := TimeToStr(DateTime);
  hour := StrToInt(copy(str, 1, 2));
  min  := StrToInt(copy(str, 4, 2));
  sec  := StrToInt(copy(str, 7, 2));
...


mrac 05.01.2005 12:07

Да нет, вы не поняли.. Я как раз так и делаю, как Ghost написал :) Я хочу разобраться, как правильно, учитывая все ньюансы сравнить текущее время - попадает оно в данный промежуток или нет? Как я написал примеры в первом посте - учитывать надо довольно много вариантов.

И еще: можно было бы конечно просто сравнивать время с заданным и потом, когда они станут равны включить второй таймер, но это не годится, т.к. если программа будет запущена, когда этот интервал уже идет, она соответственно не сработает.

Ghost 05.01.2005 17:52

mrac
Цитата:

сравнить текущее время - попадает оно в данный промежуток или нет
Ну дык напиши функцию, типа такой:
Код:

type
  strTime = string[5];
function InTimeSet(tStart, tFinal, tVerify: strTime): boolean;
var
  iStart, iFinal, iVerify: integer;
begin
  iStart  := 60 * (StrToInt(copy(tStart, 1, 2)))  + StrToInt(copy(tStart, 4, 2));
  iFinal  := 60 * (StrToInt(copy(tFinal, 1, 2)))  + StrToInt(copy(tFinal, 4, 2));
  iVerify := 60 * (StrToInt(copy(tVerify, 1, 2))) + StrToInt(copy(tVerify, 4, 2));
  if iStart <= iFinal then
    InTimeSet := (iStart <= iVerify) and (iVerify <= iFinal)
  else
    InTimeSet := (iStart <= iVerify) or  (iVerify <= iFinal);
end;


mrac 05.01.2005 17:58

Да, ночью что-то совсем тупил... утром сел, подумал и написал программку....правда еще только на листке бумаги, проверить не могу :)

sflash 19.01.2005 15:08

Цитата:

Сообщение от Ghost
mrac
А почему бы не воспользоваться дмумя таймерами:
1 - каждую секунду проверяет текущее время на принадлежность указанному промежутку и включает/выключает в зависимости от этого второй таймер.
2 - каждую секунду выполняет нужное действие.
В принципе, можно проверку в первом таймере делать и не каждую секунду, а вычислять ее в зависимости, опять-таки, от разницы между текущим временем и началом данного промежутка.
А текущее время определить просто:
Код:

var
  DateTime: TDateTime;
  str: string;
  hour, min, sec: integer;
...
  DateTime := Time;
  str  := TimeToStr(DateTime);
  hour := StrToInt(copy(str, 1, 2));
  min  := StrToInt(copy(str, 4, 2));
  sec  := StrToInt(copy(str, 7, 2));
...


Да-а-а, а потом говорят что программы на Delphi тормозят. Ну кто же так пишет. А вот так не пробовал?
DateTime : TDateTime;
hour, min, sec, sec100 : Word;
...
DecodeTime(Time,hour,min,sec,sec100);

Ничего общего не замечаешь?


Часовой пояс GMT +4, время: 18:24.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.