Як з 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;