Текущий архив: 2004.12.05;
Скачать: CL | DM;
ВнизКак узнать входит ли время в интервал? Найти похожие ветки
← →
Progh (2004-11-17 07:51) [0]Как узнать входит ли скажем время 01:00 В интервал между 22:00 и 03:00?
← →
КаПиБаРа © (2004-11-17 07:55) [1]Progh (17.11.04 7:51)
F1 - TDateTime
← →
Progh (2004-11-17 08:02) [2]
>
> [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 не выполняется
← →
kostan © (2004-11-17 08:07) [3]не знаешь дату? а как ты определил что 01:00>=22:00
однако условие правильно не выполняется!
← →
kostan © (2004-11-17 08:09) [4]а вообще подставляй дату к minInt (day-1) а к Maxint (day)
← →
Progh (2004-11-17 08:20) [5]
> [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)
← →
begin...end © (2004-11-17 08:30) [6]
> [5] Progh (17.11.04 08:20)
> TestTime(StrToTime(01:00"),StrToTime("22:00"),StrToTime("03:00"))
> - Так возвращает правильно (возвращает true)
Чего же тут правильного? Если ты это считаешь правильным, то тогда не обойтись без информации о сутках.
← →
begin...end © (2004-11-17 08:32) [7]Имея только время, можно проверять вхождение только в пределах одних суток. Поскольку TTime = TDateTime = Double, то для проверки вхождения можно использовать аналогичную функцию для вещественных чисел, а именно одну из функций InRange (см. модуль Math).
← →
kostan © (2004-11-17 08:35) [8]преобразуй Ttime в TDateTime и сравнивай!
типа так
t=day+t
MinInt:=day-1+MinInt;
MaxInt:=day+MaxInt
(токо это не код разбрись сам)
← →
Progh (2004-11-17 08:50) [9]
> преобразуй 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)
← →
begin...end © (2004-11-17 09:08) [10]
> [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. Если что не так, то извиняйте, я ещё не проснулся.
← →
Gloomer © (2004-11-17 09:20) [11]Логично было бы сделать так
С По Цена
00:00 03:00 100
03:00 6:30 200
6:30 18:00 300
21:00 24:00 100
← →
Progh (2004-11-17 09:30) [12]
> [10] begin...end © (17.11.04 09:08)
Спасибо! Так вроде работает на УРА!
Страницы: 1 вся ветка
Текущий архив: 2004.12.05;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.038 c