![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать входит ли время в интервал?
Progh © (2004-11-17 07:51:00)Как узнать входит ли скажем время 01:00 В интервал между 22:00 и 03:00?
Progh (2004-11-17 09:30:00) [1]
> [10] begin...end © (17.11.04 09:08)
Спасибо! Так вроде работает на УРА!
Gloomer (2004-11-17 09:20:00) [2]Логично было бы сделать так
С По Цена
00:00 03:00 100
03:00 6:30 200
6:30 18:00 300
21:00 24:00 100
begin...end (2004-11-17 09:08:00) [3]
> [9] Progh (17.11.04 08:50)
> С По Цена
> 21:00 03:00 100
> Так вот исходя из этой таблицы мне нужно узнать цену текущего времени(скажем 01:02)
Задача имеет много решений; откуда кто знает, к каким дням это всё относятся эти 21:00, 03:00 и 01:02; решение останется одно в случае указания дат.
На заметку: чтобы прибавить 1 день к дате, нужно к переменной TDateTime прибавить 1. Поэтому мне пришла в голову такая мысль: если время "С" и "По" не отличается больше чем на 1 сутки, то можно проверять так:
var
T, T1, T2: TDateTime;
начало
если T < T1 то
T := T + 1;
если T2 < T1 то
T2 := T2 + 1;
// а вот теперь проверяем на вхождение с помощью InRange()
конец.
P.S. Если что не так, то извиняйте, я ещё не проснулся.
Progh (2004-11-17 08:50:00) [4]
> преобразуй Ttime в TDateTime и сравнивай!
> типа так
> t=day+t
> MinInt:=day-1+MinInt;
> MaxInt:=day+MaxInt
> (токо это не код разбрись сам)
Как я понял переменная day=1. Вобщем при t=21:59 MinInt=22:00 MaxInt=3:00
ф-ия выдала true, хотя должна была false ;)
> [7] begin...end © (17.11.04 08:32)
Дело в том что у меня есть таблица с ценами такого вида:
С По Цена
21:00 03:00 100
03:00 6:30 200
6:30 18:00 300
Так вот исходя из этой таблицы мне нужно узнать цену текущего времени(скажем 01:02)
kostan (2004-11-17 08:35:00) [5]преобразуй Ttime в TDateTime и сравнивай!
типа так
t=day+t
MinInt:=day-1+MinInt;
MaxInt:=day+MaxInt
(токо это не код разбрись сам)
begin...end (2004-11-17 08:32:00) [6]Имея только время, можно проверять вхождение только в пределах одних суток. Поскольку TTime = TDateTime = Double, то для проверки вхождения можно использовать аналогичную функцию для вещественных чисел, а именно одну из функций InRange (см. модуль Math).
begin...end (2004-11-17 08:30:00) [7]
> [5] Progh (17.11.04 08:20)
> TestTime(StrToTime(01:00'),StrToTime('22:00'),StrToTime('03:00'))
> - Так возвращает правильно (возвращает true)
Чего же тут правильного? Если ты это считаешь правильным, то тогда не обойтись без информации о сутках.
Progh (2004-11-17 08:20:00) [8]
> [3] kostan © (17.11.04 08:07)
> не знаешь дату? а как ты определил что 01:00>=22:00
> однако условие правильно не выполняется!
> а вообще подставляй дату к minInt (day-1) а к Maxint (day)
Ты имеешь ввиду так :
function TestTime(t,MinInt,MaxInt:TTime):Boolean;
begin
MinInt := MinInt-1;
if (t>=MinInt) and (t<=MaxInt) then Result := true;
end;
Так тоже работает неправильно :
TestTime(StrToTime(01:00'),StrToTime('22:00'),StrToTime('03:00')) - Так возвращает правильно (возвращает true)
а
TestTime(StrToTime('21:00'),StrToTime('22:00'),StrToTime('03:00')) - Так не правильно (возвращает true)
kostan (2004-11-17 08:09:00) [9]а вообще подставляй дату к minInt (day-1) а к Maxint (day)
kostan (2004-11-17 08:07:00) [10]не знаешь дату? а как ты определил что 01:00>=22:00
однако условие правильно не выполняется!
Progh (2004-11-17 08:02:00) [11]
>
> [1] КаПиБаРа © (17.11.04 07:55)
Дело в том, что просто сравнить способом :
function TestTime(t,MinInt,MaxInt:TTime):Boolean;
begin
if (t>=MinInt) and (t<=MaxInt) then Result := true
end;
я не могу, так как незнаю дату.
Логически 01:00 входит в интервал между 22:00 и 03:00, но дання ф-ия возвращает что не входит, так как условие 01:00>=22:00 не выполняется
КаПиБаРа (2004-11-17 07:55:00) [12]Progh (17.11.04 7:51)
F1 - TDateTime