Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

Как из TDateTime получить TDateTime минус несколько часов   Найти похожие ветки 

 
Vitaly ©   (2006-12-21 16:45) [0]

?


 
Сергей М. ©   (2006-12-21 16:47) [1]

А в чем сложности ?


 
sicilla ©   (2006-12-21 16:50) [2]

var T1,T2: TDateTime

T1 := Now;
T2 := T1 - strtodatetime("30.12.1890 00:05:00");

30.12.1890 - я не уверен что правильно, но эту дату (проверь и измени), должна выдавать функция datetimetostr(0)


 
Anatoly Podgoretsky ©   (2006-12-21 16:51) [3]

> Vitaly  (21.12.2006 16:45:00)  [0]

TDateTime - константа=несколько часов или переменная


 
Чапаев ©   (2006-12-21 16:59) [4]

> [2] sicilla ©   (21.12.06 16:50)
1899


 
Vitaly ©   (2006-12-21 17:06) [5]

может я чего не понимаю или заработался :)

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;


 
Anatoly Podgoretsky ©   (2006-12-21 17:12) [6]

> Vitaly  (21.12.2006 17:06:05)  [5]

Вот это ты зря закоментировал, это как раз операция с TDateTime +/- константа/переменная, все остальное можно выкинуть.


 
novill ©   (2006-12-21 17:12) [7]

> [0] Vitaly ©   (21.12.06 16:45)

модуль Dateutils
функция IncHour
F1 по необходимости


 
Vitaly ©   (2006-12-21 17:20) [8]

> Anatoly Podgoretsky ©   (21.12.06 17:12) [6]

это я пробовал и получил такие разные результаты. Почему?

> novill ©   (21.12.06 17:12) [7]

у меня в D5 нет такой функции


 
Anatoly Podgoretsky ©   (2006-12-21 17:20) [9]

> Vitaly  (21.12.2006 17:20:08)  [8]

Не видать, приводи код


 
Vitaly ©   (2006-12-21 17:22) [10]

Это весь код по событию дблклик формы


 
Vitaly ©   (2006-12-21 17:23) [11]

Чего это меня в другой форум выбросили...Ну да бог с ними :)


 
iXT ©   (2006-12-21 17:29) [12]

TDateTime:=TDateTime-h/24 //h: кол-во часов


 
novill ©   (2006-12-21 17:30) [13]

> [11] Vitaly ©   (21.12.06 17:23)

ты [7] пробовал?


 
BOB16   (2006-12-21 17:32) [14]

Согласен с >[12]
TDateTime:=TDateTime-h/24.0 //h: кол-во часов


 
Vitaly ©   (2006-12-21 17:35) [15]

> novill ©   (21.12.06 17:30) [13]

да, нет у меня такого модуля

> iXT ©   (21.12.06 17:29) [12]

спасибо (сам не сообразил), но проблема осталась...
какого ляда он прибавляет часы?
причем если через день переходит - то день убавляет на один.
Ничего не понимаю!


 
Jeer ©   (2006-12-21 17:38) [16]


> Vitaly ©   (21.12.06 16:45)


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

TDateTime - это тип double, где целая часть - число суток, в которых 24 земных часа, а дробная часть - часть времени от одних суток.

Значит, чтобы вычесть из даты dt: TDateTime несколько часов iH: integer (например), надо эти часы привести к отношению iH / 24.0 и вычесть из даты:
dt := (dt - iH / 24.0);

Как и отмечено справедливо выше в [12]


 
BOB16   (2006-12-21 17:39) [17]

Согласен с >[12]
с маленькими оговорками,
Только нужно учитывать, что:
double 1.0 = 1 суткам в TDatetime,
а если вычитать из TDatetime h/24.0,
то при переходе границы в 1.0 double,
будут потеряны часть долей секунды (Как никак double),

Поэтому, если нужно точно конкретно - N часов, то лучше махинации
с DecodeTime()-EncodeTime().


 
novill ©   (2006-12-21 17:39) [18]

> [15] Vitaly ©   (21.12.06 17:35)

Страно!

а что справка по функции IncHour говорит?


 
Jeer ©   (2006-12-21 17:40) [19]


> то при переходе границы в 1.0 double,
> будут потеряны часть долей секунды (Как никак double),


А подробнее о "странностях" такого перехода ?


 
Vitaly ©   (2006-12-21 17:44) [20]

> Jeer ©   (21.12.06 17:38) [16]

не надо ругаться - мне не 12 лет
проблема озвучена, код приведен - попробуйте и подскажите, плиииииз, почему прибавляет, а не вычитает?
Или это у меня только так себя ведёт сей код?

> novill ©   (21.12.06 17:39) [18]

не находит :)


 
iXT ©   (2006-12-21 17:47) [21]


> Vitaly ©   (21.12.06 17:44) [20]

Вот было бы 12, может и не ругались

Код где у тебя почему прибавляет, а не вычитает? ГДЕ?


 
Vitaly ©   (2006-12-21 17:50) [22]

да здесь он давно:

Vitaly ©   (21.12.06 17:06) [5]


 
Jeer ©   (2006-12-21 17:50) [23]


> 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 часов, то попадем в прошлый день - догадайся почему.


 
Anatoly Podgoretsky ©   (2006-12-21 17:51) [24]

> Vitaly  (21.12.2006 17:22:10)  [10]

В этом коде нет сложения


 
Jeer ©   (2006-12-21 17:52) [25]


> (17.0 + 40.0/60.0)/24.0


Читать: (17.0 + 44.0/60.0)/24.0


 
novill ©   (2006-12-21 17:52) [26]

> > novill ©   (21.12.06 17:39) [18]
>
> не находит :)


тогда вот ее исходник

function IncHour(const AValue: TDateTime;
 const ANumberOfHours: Int64): TDateTime;
begin
 Result := ((AValue * 24) + ANumberOfHours) / 24;
end;


 
Anatoly Podgoretsky ©   (2006-12-21 17:53) [27]

> novill  (21.12.2006 17:39:18)  [18]

В Д5 ее может не быть, это потом Борланд пошел на поводу у ламеров и сделал функции класса IncDay и то как оказалось день прибавить могут, а отнять ума не хватает.


 
BOB16   (2006-12-21 17:54) [28]

>[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) [29]

> iXT  (21.12.2006 17:47:21)  [21]

> Вот было бы 12, может и не ругались

И образование как бы высшее!


 
Vitaly ©   (2006-12-21 17:55) [30]

Я вижу, что нет сложения - но дата УВЕЛИЧИВАЕТСЯ

ещё раз код, если непонятно с коментарием:

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;


 
iXT ©   (2006-12-21 17:59) [31]

Издеваешся???


 
novill ©   (2006-12-21 18:03) [32]

> [30] Vitaly ©   (21.12.06 17:55)

все правильно! так и должно быть! ты какой год функции кормишь? и от какого года TdateTime считает? :)


 
Jeer ©   (2006-12-21 18:07) [33]


> BOB16   (21.12.06 17:54) [28]


А ты не пробовал считать Now с точностью до 1 пикосекунды ?
Вот бы удивился.

мзр для double == TDateTime дает сейчас около 0.08 ms


 
Anatoly Podgoretsky ©   (2006-12-21 18:09) [34]

> Jeer  (21.12.2006 18:07:33)  [33]

Похоже на истину, по крайней мере до 10000 года.
Говорить об точности преобразования не приходится, можно лишь говорить об приблизительной точностью с данной величиной.


 
Vitaly ©   (2006-12-22 08:44) [35]

Утро - вечера мудренее :)
Даже минусов вчера не видел
Разобрался, всем спасибо!


> novill ©   (21.12.06 17:52) [26]

Спасибо за красивый код.


 
Jeer ©   (2006-12-22 11:20) [36]


> Vitaly ©   (22.12.06 08:44) [35]


> Спасибо за красивый код.


А по мне - так этот красивее:

function IncHour(const AValue: TDateTime;
const ANumberOfHours: Int64): TDateTime;
begin
Result := (AValue + ANumberOfHours / 24.0);
end;



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

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.086 c
15-1167024660
Slider007
2006-12-25 08:31
2007.01.14
С днем рождения ! 24 декабря


2-1166873475
Серый
2006-12-23 14:31
2007.01.14
удаление из stringgrid


4-1156477511
Kacnep
2006-08-25 07:45
2007.01.14
Сервис не ShutDownит сервер с выданными привилегиями.


15-1166454093
DillerXX
2006-12-18 18:01
2007.01.14
Вопрос по 2м шахматным позициям


15-1166961931
Ксардас
2006-12-24 15:05
2007.01.14
Есть ли теорема, подобная теореме Виета для корней кв. уравнения,