Як з TDateTime отримати TDateTime мінус кілька годин

А в чому складності?

var T1, T2: TDateTime

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

30.12.1890 - я не впевнений що правильно, але цю дату (перевір та зміни), повинна видавати функція datetimetostr(0)

TDateTime - константа = кілька годин або змінна

може я чогось не розумію або заробився :)

Ось це ти даремно закоментував, це якраз операція з TDateTime +/- константа/змінна, все інше можна викинути.

це я пробував і одержав такі різні результати. Чому?

у мене в D5 немає такої функції

Не видно, наводь код

Це весь код за подією.

Чого мене в інший форум викинули. Ну та бог із ними :)

TDateTime:=TDateTime-h/24 //h: у годині

Згоден з >[12] TDateTime:=TDateTime-h/24.0 //h: у годин

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

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

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

Значить, щоб відняти з дати dt: TDateTime кілька годин iH: integer (наприклад), треба цей годинник привести до відношення iH / 24.0 і відняти від дати: dt := (dt - iH / 24.0);

Як і зазначено справедливо вище в [12]

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

Тому, якщо потрібно точно конкретно - N годин, краще махінації сDecodeTime()-EncodeTime() .

а що довідка щодо функції IncHour каже?

> то при переході кордону до 1.0 double, > будуть втрачені частина часток секунди (Як ніяк double),

А докладніше про "дива" такого переходу?

не треба лаятися - мені не 12 років проблема озвучена, код наведений - спробуйте і підкажіть, пліїїз, чому додає, а не віднімає? Або це у мене тільки так поводиться цей код?

Код де в тебечому додає, а не віднімає?ДЕ?

та тут він давно:

Та я ще й не почав лаятись:)

Береш ручку та кулькулятор і вважаєш

Нині 17:44, тобто. (17.0 + 40.0/60.0)/24.0 = 0.738.. Якщо ми віднімемо 18 годин, то потрапимо минулого дня - здогадайся чому.

У цьому коді немає додавання

тоді ось її вихідник

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

У Д5 її може не бути, це потім Борланд пішов на поводу у ламерів і зробив функції класу IncDay і те як виявилося день додати можуть, а забрати розуму не вистачає.

>[19] > то при переході кордону до 1.0 double, > будуть втрачені частина часткою секунди (Як double), > А докладніше про "дива" такого переходу?

Декілька років тому на Delphi 4 зіткнувся з проблемою, коли оперував часом з точністю до мілісекунд.

Так от, коли безпосередньо вичитав з аналізованого часу Seconds/24.0/60.0/60.0 (час першої години нової доби), то при поверненні в попередню добу були не ті мілісекунди, тобто наприклад (>зараз вже не пам'ятаю!) було час 01 година 59 хвилин 16 секунд204мілісекунди вичитав 5 годин рівно, і отримував: 21 год59 хвилин 16 секунд205мілісекунд

> Ото було б 12, може і не сварилися

І освіта як би вища!

Я бачу, що немає складання - але дата ЗБІЛЬШУЄТЬСЯ

ще раз код, якщо незрозуміло з коментарем:

А ти не пробував рахувати Now з точністю до 1 пікосекунди? Ось би здивувався.

мзр для double == TDateTime даєзаразблизько 0.08 ms

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

Ранок - вечори мудріший :) Навіть мінусів вчора не бачив Розібрався, дякую всім!

А на мене – так цей красивіший:

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