Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2009, 10:05   #1
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
Вопрос Определение времени в диапазоне

Приветствую.

Имеется серия TDateTime. 4 штуки.
1 - определяет начало временного диапазона
2 - определяет конец временного диапазона
3 - определяет начало времени
4 - определяет конец времени

Тоесть, 1 и 2 это некий диапазон, 2 и 3 это время которое находится ( или не находится, или находится частично, как угодно ) в этом диапазоне.
Задача - как можно быстрее посчитать количество времени, которое занимает промежуток 2-3 в диапазоне 1-2. Дата не используется, по этому нужно учесть и 24х часовой период.

Пока получился относительный бред. Считает, но ... порой ошибается))

Буду благодарен за любой хелп))
Давно уже не программил, а тут вот нужно
Mouse123 вне форума Ответить с цитированием
Старый 12.05.2009, 10:47   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

uses dateutils и изучать методы этого модуля )
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 12.05.2009, 10:56   #3
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

А все бы ничего, но времени в обрез совсем
Mouse123 вне форума Ответить с цитированием
Старый 12.05.2009, 11:04   #4
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

Код:
var
t1,t2:tdatetime;
res:real;
begin
if 1>3 then
 t1:=1
else
 t1:=3;
if 2<4 then
 t2:=2
else
 t2:=4;
res:=t2-t1;
end;
результат выдается в миллисекундах, вместо 1,2,3,4 подставь свои даты
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 12.05.2009, 11:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

SecondsBetween(DateTime2,DateTime3) ; - даст тебе время в секундах. Далее просто получи из них часы минуты, и пр. обычными арифметическими операциями.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2009, 11:39   #6
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
Смущение

А что-то не получается

Вот то, что у меня до этого выходило, и оно, в большенстве случаев работает верно... но

Код:
function GetTimeInZone (ZoneStart, ZoneEnd, TimeStart, TimeEnd :TTime ):Integer;
var
  ZoneStart_H, // начало зоны
  ZoneStart_M, 
  ZoneEnd_H,  // конец зоны
  ZoneEnd_M,
  TimeStart_H,  // начало времени
  TimeStart_M,
  TimeEnd_H,  // конец времени
  TimeEnd_M,
  buf_1,  // а секунды мне и не нужны :)
  buf_2 : WORD; 
begin
// допустим разбиваем это все ...
  DecodeTime ( ZoneStart  , ZoneStart_H, ZoneStart_M, buf_1, buf_2 );
  DecodeTime ( ZoneEnd    , ZoneEnd_H  , ZoneEnd_M  , buf_1, buf_2 );
  DecodeTime ( TimeStart  , TimeStart_H, TimeStart_M, buf_1, buf_2 );
  DecodeTime ( TimeEnd    , TimeEnd_H  , TimeEnd_M  , buf_1, buf_2 );

  Result := 0;

// если время вне зоны то выходим с нулем
  if TimeStart_H > ZoneEnd_H then exit;
  if TimeEnd_H < ZoneStart_H then exit;
  
// если время меньше начала зоны, то считаем от начала зоны
  if TimeStart_H < ZoneStart_H then
    TimeStart_H := ZoneStart_H;

// если время больше конца зоны, то считаем до конца зоны
  if TimeEnd_H > ZoneEnd_H then
    TimeEnd_H := ZoneEnd_H;

// возвращаем в минутах кол-во часов в зоне
  Result := 60*(TimeEnd_H - TimeStart_H);

// вот тут фигняс полная
// как правильно посчитать разницу минут? Как и часы или так тоже можно?
  if TimeStart_H = TimeEnd_H then
     Result := Result + TimeEnd_M - TimeStart_M
  else
     Result := Result - TimeStart_M + TimeEnd_M;
end;
happy end;

Вобщем все бы ничего, более-менне, но код явно корявый и ... по скольку эта функция для одного промежутка времени вызывается много раз ( для подсчета времени в каждой зоне ), то порой минуты коим-то чудом начинают умножатся на два
Да еще как-то нужно это дело оптимизировать, т.к. выполняется оно раз по 300 в секунду :'( + Еще тьма из SQLа валится. Я плакаю

Господа, подсоблите .. Я вообще рук. отдела, но ввиду наличия программиста в отпуске парюсь вот такой радостью...

Последний раз редактировалось Stilet; 12.05.2009 в 13:08.
Mouse123 вне форума Ответить с цитированием
Старый 12.05.2009, 12:02   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как правильно посчитать разницу минут? Как и часы или так тоже можно?
Код:
uses dateutils...
....
 MinutesBetween(Начальная дата-время, Конечная дата-время)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2009, 12:10   #8
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

А в остальном код мой хоть отдаленно логичен?
Mouse123 вне форума Ответить с цитированием
Старый 12.05.2009, 13:10   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Логичен, но время в Делфи штука капризная. Тут лучше функция ми управлять чем просто вот так к значениям обращаться.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2009, 13:59   #10
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

Переиначил вот так :
Код:
function GetTimeInZone (ZoneStart, ZoneEnd, TimeStart, TimeEnd :TTime ):Integer;
begin
  Result := 0;
  // если время начала больше чем конец зоны, то идем вон
  if TimeStart > ZoneEnd then exit;
  // если время конца меньше начала, то туда-же...
  if TimeEnd < ZoneStart then exit;

  // Если начало меньше начала зоны, т.е. выходит за рамки, то считаем от начала зоны
  if TimeStart < ZoneStart then
    TimeStart := ZoneStart;
// тоже с хвостом
  if TimeEnd > ZoneEnd then
    TimeEnd := ZoneEnd;

 Result := MinutesBetween ( TimeStart, TimeEnd);
end;
Вроди функционирует Главное - чтобы в них дат небыло, иначе начинается котовасия
Mouse123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Суммесли по 2 условиям в одном диапазоне knahrn Microsoft Office Excel 5 08.05.2009 13:14
Определение суток перевода времени на летнее/зимнее ViTYAi Помощь студентам 1 20.05.2008 16:41
функция поиска в диапазоне Neonoff Microsoft Office Excel 1 18.02.2008 03:52
как найти данные в диапазоне Tanya2007 Microsoft Office Excel 2 20.11.2007 19:33