Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как из TDateTime получить TDateTime минус несколько часов [D5]


Страницы:   1 2

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().


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо