Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];

Вниз

Временные интервалы...   Найти похожие ветки 

 
BillyJeans   (2003-09-16 14:05) [0]

Может кто подскажет красивый пример обработки следующей ситуации:
Есть интервал времени например с 8 до 21 а также время начала звонка и продолжительность. Необходимо проверить попал ли звонок в заданный интервал, и какая была продолжительность в рамках этого интервала.
С данным интервалом проблем нет, а вот если задать интервал с 21 до 8 то тут уже начинаются траблы с переходом не следующий день...


 
clickmaker   (2003-09-16 14:07) [1]

А что за траблы?


 
pasha_golub   (2003-09-16 14:11) [2]

А если разбить интервал на два [21..24]U[0..8]?


 
ZEE   (2003-09-16 14:15) [3]

если используется TTime, то надо вместо него пользовать TDateTime - чтоб и день учитывать...


 
Johnmen   (2003-09-16 14:17) [4]

>...какая была продолжительность в рамках этого интервала.

Обычное выражение :
Min(MaxDateTime1,MaxDateTime2)-Max(MinDateTime1,MinDateTime2)


 
ZrenBy   (2003-09-16 14:21) [5]

((T2-T1)+24) mod 24


 
BillyJeans   (2003-09-16 18:28) [6]

разбить на два интервала, это пока единственный способ, который пришел мне в голову, но плох он тем, что много коду написать придется... Звонок может быть раньше начала интервала, а закончится после полуночи, или до полуночи, а закончится после окончания интервала, и т.д. Все это необходимо будет описать :(
Хочется узнать, может кто сталкивался с проблемой, и поделится изящными идеями...


 
BillyJeans   (2003-09-17 08:31) [7]

2 clickmaker © (16.09.03 14:07) [1]
читай вопрос...

2 ZEE © (16.09.03 14:15) [3]
использую TDateTime...

2 Johnmen © (16.09.03 14:17) [4]
при интервале 21-8 звонок с 23 по 5
Min(MaxDateTime1,MaxDateTime2)-Max(MinDateTime1,MinDateTime2) даст нам следующее:
Min(8, 5)-Max(21, 23) = -18 вместо положенных 6

2 ZrenBy © (16.09.03 14:21) [5]
((T2-T1)+24) mod 24 что это???


 
MBo   (2003-09-17 08:37) [8]

>2 ZrenBy © (16.09.03 14:21) [5]
>((T2-T1)+24) mod 24 что это???
Это как раз и есть изящная идея. Учти только, что здесь используются часы.


 
BillyJeans   (2003-09-17 08:58) [9]

2 MBo © (17.09.03 08:37) [8]
T1 и T2 - что это за время? В моем случае есть 3 значения времени и одна продолжительность...


 
Anatoly Podgoretsky   (2003-09-17 09:16) [10]

BillyJeans © (17.09.03 08:31) [7]
Математика, если число меньше 0, то прибавь 24 часа.


 
Anatoly Podgoretsky   (2003-09-17 09:18) [11]

А раз тип TDateTime, то вообще не может быть вопрос, от болшей даты отнимаем меньшу и имеем всегда интервал в формате D.d


 
BillyJeans   (2003-09-17 09:51) [12]

Anatoly Podgoretsky © (17.09.03 09:18) [11]
А зачем мне разница между двумя датами? И узнать время между двумя значениями времени для меня не вопрос...
Вопрос в том, как узнать какой промежуток сеанса попал в заданный промежуток например с 21 по 8 часов?


 
Borgir   (2003-09-17 10:01) [13]

Не ищи изящества. Просто бери и сравнивай границы сеанса с границами промежутка. Из результатов и делай выводы и вычисления


 
BillyJeans   (2003-09-17 10:03) [14]

Borgir (17.09.03 10:01) [13]
Много очень сравнений получается :(


 
Jeer   (2003-09-17 10:07) [15]

BillyJeans © (17.09.03 09:51) [12]
Слюшай, дорогой.
Тебе привели изящное решение твоей промблемы.
Если не догоняешь, так поставь эксперимент с диапазонами и увидишь разницу.


 
Anatoly Podgoretsky   (2003-09-17 10:12) [16]

А интервал вот для этого, раз не понимаешь как считаются интервалы
2 Johnmen © (16.09.03 14:17) [4]
при интервале 21-8 звонок с 23 по 5
Min(MaxDateTime1,MaxDateTime2)-Max(MinDateTime1,MinDateTime2) даст нам следующее:
Min(8, 5)-Max(21, 23) = -18 вместо положенных 6


А для попадания в интервал, тоже используется обычная математика

Result :=
(ДатаНачала<=StartInt) and (ДатаКонца>=EndInt) or
(ДатаНачала>=StartInt) and (ДатаНачала>=EndInt) or
(ДатаКонца>=StartInt) and (ДатаКонца>=EndInt)


 
Anatoly Podgoretsky   (2003-09-17 10:13) [17]

Jeer © (17.09.03 10:07) [15]
Доктор сказал в школу :-)


 
Anatoly Podgoretsky   (2003-09-17 10:18) [18]

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


 
BillyJeans   (2003-09-17 10:33) [19]

Anatoly Podgoretsky © (17.09.03 10:12) [16]
Вообще то с попаданием в ночной интервал проблем не было...
(ДатаНачала>=StartInt) or (ДатаНачала<=EndInt)
И что за реверсный метод?


 
Sandman25   (2003-09-17 10:39) [20]

>(ДатаНачала>=StartInt) or (ДатаНачала<=EndInt)

Если StartInt <= EndInt, то это выражение всегда истинно независимо от ДатаНачала


 
BillyJeans   (2003-09-17 10:41) [21]

Sandman25 © (17.09.03 10:39) [20]
StartInt = 21
EndInt = 8


 
BillyJeans   (2003-09-17 11:50) [22]

Неужели никто не подскажет???


 
Anatoly Podgoretsky   (2003-09-17 11:56) [23]

Sandman25 © (17.09.03 10:39) [20]
По определению, время конца >= время начала, речь про TDateTime


 
Gerakl   (2003-09-17 13:15) [24]

Prishlos" napisat" kogda-to programky
dlya zapolneniya TStrings nazvaniem mesyacev
vxodyashix v interval Dates.Mozhet pomozhet...

procedure FillMonths(aStrs: TStrings; aStartDate, aEndDate: TDateTime);
var
fYear, fMonth, fDay,
fYear2, fMonth2, fDay2: word;
i, f12: Integer;
begin
if aStartDate >= aEndDate then exit;
DecodeDate(aStartDate, fYear, fMonth, fDay);
DecodeDate(aEndDate, fYear2, fMonth2, fDay2);
if fMonth2 < fMonth then
f12 := 12
else
f12 := fMonth2;
for i := fMonth to f12 do
aStrs.Add(LongMonthNames[i]+ format(" %d", [fYear]));

FillMonths(aStrs, encodedate(fYear+1,1,fDay), aEndDate);
end;{procedure FillMonths}


 
Jeer   (2003-09-17 15:15) [25]

Редко привожу код, но тут публика..:

//Попадание звонка в интервал с tm1 по tm2
function IsCallToInterval(tm1,tm2,tmC: TDateTime): boolean;
begin
Result := ((tmC <= tm2) and (tmC >= tm1));
end;

// длительность звонка в интервале tm-tm2
// не факт, что он завершился в нем
function DeltaTime(tm1,tm2,tmBC,tmEC: TDateTime): TDateTime;
begin
Result := tmEC - tmBC;
if (tmEC > tm2) then Result := (tm2 - tBC);
end;

// Итого
if IsCallToInterval(tm1,tm2,tmC) then dt := DeltaTime(tm1,tm2,tmBC,tmEC);

// tm1,tm2 - начало-конец интервала
// tmBC,tmEC - начало-конец звонка


 
BillyJeans   (2003-09-17 17:06) [26]

Jeer © (17.09.03 15:15) [25]
не факт, что он начался в интервале!


 
Jeer   (2003-09-17 17:19) [27]

Так ведь спрошено было "попал ли звонок"
Остальное сам додумаешь


 
BillyJeans   (2003-09-17 17:23) [28]

Jeer © (17.09.03 17:19) [27]

вот остальная часть вопроса:
..и какая была продолжительность в рамках этого интервала.


 
Jeer   (2003-09-17 17:26) [29]

С логикой у Вас нелады.

Если звонок (я понял, что момент звонка) попал в интервал,
то какова продолжительность части сеанса попавшая в заданный интервал.
Ответ дан.


 
Владислав   (2003-09-17 17:28) [30]

Начальные условия: Есть дата-время начала и окончания звонка. Есть границы интервалов.

1. Ты можешь определить, в каком интервале начался звонок?
2. Если да, то ты можешь определить окончание этого интервала.
3. Также можешь определить продолжительность этого интервала.
4. Можешь определить, вышел ли звонок за пределы интервала.
5. Можешь посчитать продолжительность звонка в этом интервале.
6. Можешь определить, продолжается ли звонок в следующем интервале.
7. Погнали со второго пункта в цикле, пока звонок не закончился.

Если что в алгоритме непонятно, спрашивай.

"С данным интервалом проблем нет, а вот если задать интервал с 21 до 8 то тут уже начинаются траблы с переходом не следующий день..."

Не вижу траблов. Если видишь, опиши их. Поможем решить.


 
BillyJeans   (2003-09-17 17:43) [31]

Владислав © (17.09.03 17:28) [30]

Почитай посты...


 
Владислав   (2003-09-17 17:53) [32]

> BillyJeans © (17.09.03 17:43) [31]

Они не мне адресованы :)

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


 
BillyJeans   (2003-09-17 18:06) [33]

Владислав © (17.09.03 17:53) [32]

offline...


 
ads   (2003-09-17 18:07) [34]

Честно говоря я тоже не вижу проблемы.
после :
if EndInt <= StartInt then EndInt := EndInt + 24;
получаем два TDateTime и соответственно
"нормализованный" интервал.
дальше как обычно...


 
BillyJeans   (2003-09-17 18:10) [35]

ads (17.09.03 18:07) [34]

var EndInt: TDateTime;
А теперь подумай, что будет после твоего кода...


 
Владислав   (2003-09-17 18:17) [36]

Сорри. Аську забыл включить. Авторизуй плиз.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.009 c
14-96379
Mr@MsGuns
2003-09-11 11:35
2003.09.29
Все. Бросаем заниматься сексом. Прямо сейчас. Ни одной девочки.


3-96097
DelphiNew
2003-09-09 15:48
2003.09.29
Sql сервер


1-96256
Term
2003-09-18 11:31
2003.09.29
Поясните в чом проблема?


14-96388
jack128
2003-09-11 01:29
2003.09.29
Именинники 11 сентября


6-96326
snake1977
2003-07-29 09:12
2003.09.29
Connect в TClientSocket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский