![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из TDateTime получить TDateTime минус несколько часов [D5]
Vitaly © (2006-12-21 16:45:00)?
Jeer (2006-12-22 11:20:00) [1]
> Vitaly © (22.12.06 08:44) [35]
> Спасибо за красивый код.
А по мне - так этот красивее:
function IncHour(const AValue: TDateTime;
const ANumberOfHours: Int64): TDateTime;
begin
Result := (AValue + ANumberOfHours / 24.0);
end;
Vitaly (2006-12-22 08:44:00) [2]Утро - вечера мудренее :)
Даже минусов вчера не видел
Разобрался, всем спасибо!
> novill © (21.12.06 17:52) [26]
Спасибо за красивый код.
Anatoly Podgoretsky (2006-12-21 18:09:00) [3]> Jeer (21.12.2006 18:07:33) [33]
Похоже на истину, по крайней мере до 10000 года.
Говорить об точности преобразования не приходится, можно лишь говорить об приблизительной точностью с данной величиной.
Jeer (2006-12-21 18:07:00) [4]
> BOB16 (21.12.06 17:54) [28]
А ты не пробовал считать Now с точностью до 1 пикосекунды ?
Вот бы удивился.
мзр для double == TDateTime дает сейчасоколо 0.08 ms
novill (2006-12-21 18:03:00) [5]> [30] Vitaly © (21.12.06 17:55)
все правильно! так и должно быть! ты какой год функции кормишь? и от какого года TdateTime считает? :)
iXT (2006-12-21 17:59:00) [6]Издеваешся???
Vitaly (2006-12-21 17:55:00) [7]Я вижу, что нет сложения - но дата УВЕЛИЧИВАЕТСЯ
ещё раз код, если непонятно с коментарием:
var ss: string;
d,t: TDateTime;
begin
ss := '06/12/21 14:50:16';
d := EncodeDate( strToInt(copy(ss,1,2)),
strToInt(copy(ss,4,2)),
strToInt(copy(ss,7,2)));
t := EncodeTime(strToInt(copy(ss,11,2)),
strToInt(copy(ss,14,2)),
strToInt(copy(ss,17,2)), 0);
replaceTime(d, t);
d := d - EncodeTime(5, 0,0,0); //дата получается ПЛЮС 5 часов
// d := now - EncodeTime(5, 0,0,0); //дата получается МИНУС 5 часов
caption := FormatDateTime('yy"/"mm"/"dd hh":"nn":"ss', d);
end;
BOB16 (2006-12-21 17:54:00) [8]>[19]
> то при переходе границы в 1.0 double,
> будут потеряны часть долей секунды (Как никак double),
> А подробнее о "странностях" такого перехода ?
Несколько лет назад на Delphi 4 столкнулся с проблемой, когда оперировал временем с точностью до миллисекунд.
Так вот, когда напрямую вычитал из анализируемого времени Seconds/24.0/60.0/60.0 (время первых часов новых суток),
то при возврате в предыдущие сутки были не те миллисекунды, т.е.
к примеру ( сейчас уже не помню!)
было время 01 час 59 минут 16 секунд 204миллисекунды вычитал 5 часов ровно, и получал:
21 час 59 минут 16 секунд 205миллисекунд
Anatoly Podgoretsky (2006-12-21 17:54:00) [9]> iXT (21.12.2006 17:47:21) [21]
> Вот было бы 12, может и не ругались
И образование как бы высшее!
Anatoly Podgoretsky (2006-12-21 17:53:00) [10]> novill (21.12.2006 17:39:18) [18]
В Д5 ее может не быть, это потом Борланд пошел на поводу у ламеров и сделал функции класса IncDay и то как оказалось день прибавить могут, а отнять ума не хватает.
novill (2006-12-21 17:52:00) [11]> > novill © (21.12.06 17:39) [18]
>
> не находит :)
тогда вот ее исходник
function IncHour(const AValue: TDateTime;
const ANumberOfHours: Int64): TDateTime;
begin
Result := ((AValue * 24) + ANumberOfHours) / 24;
end;
Jeer (2006-12-21 17:52:00) [12]
> (17.0 + 40.0/60.0)/24.0
Читать: (17.0 + 44.0/60.0)/24.0
Anatoly Podgoretsky (2006-12-21 17:51:00) [13]> Vitaly (21.12.2006 17:22:10) [10]
В этом коде нет сложения
Jeer (2006-12-21 17:50:00) [14]
> Vitaly © (21.12.06 17:44) [20]
>
> > Jeer © (21.12.06 17:38) [16]
>
> не надо ругаться - мне не 12 лет
Да я еще и не начал ругаться:)
Берешь ручку и кулькулятор и считаешь
Сейчас 17:44, т.е. (17.0 + 40.0/60.0)/24.0 = 0.738..
Если мы вычтем 18 часов, то попадем в прошлый день - догадайся почему.
Vitaly (2006-12-21 17:50:00) [15]да здесь он давно:
Vitaly © (21.12.06 17:06) [5]
iXT (2006-12-21 17:47:00) [16]
> Vitaly © (21.12.06 17:44) [20]
Вот было бы 12, может и не ругались
Код где у тебя почему прибавляет, а не вычитает?ГДЕ?
Vitaly (2006-12-21 17:44:00) [17]> Jeer © (21.12.06 17:38) [16]
не надо ругаться - мне не 12 лет
проблема озвучена, код приведен - попробуйте и подскажите, плиииииз, почему прибавляет, а не вычитает?
Или это у меня только так себя ведёт сей код?
> novill © (21.12.06 17:39) [18]
не находит :)
Jeer (2006-12-21 17:40:00) [18]
> то при переходе границы в 1.0 double,
> будут потеряны часть долей секунды (Как никак double),
А подробнее о "странностях" такого перехода ?
novill (2006-12-21 17:39:00) [19]> [15] Vitaly © (21.12.06 17:35)
Страно!
а что справка по функции IncHour говорит?
BOB16 (2006-12-21 17:39:00) [20]Согласен с >[12]
с маленькими оговорками,
Только нужно учитывать, что:
double 1.0 = 1 суткам в TDatetime,
а если вычитать из TDatetime h/24.0,
то при переходе границы в 1.0 double,
будут потеряны часть долей секунды (Как никак double),
Поэтому, если нужно точно конкретно - N часов, то лучше махинации
сDecodeTime()-EncodeTime().