Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1143315416
Godness
2006-03-25 22:36
2007.01.14
Как избавится от мерцация формы при добавлении строк в Memo?


1-1164032851
Alexis
2006-11-20 17:27
2007.01.14
Получение всех шрифтов системы


2-1167038783
D@Nger
2006-12-25 12:26
2007.01.14
Поиск в БД Парадокс


15-1166814293
Ученик чародея
2006-12-22 22:04
2007.01.14
Что курили в Microsoft, когда это писали?


15-1166879717
ыгыгыгыгы
2006-12-23 16:15
2007.01.14
плинтус





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский