Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
ВнизКак из 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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.016 c