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

Вниз

просьба проверить функцию   Найти похожие ветки 

 
Gu   (2011-12-10 09:41) [0]

надо получить время между датами, но не в тех форматах, которые dateutils дает (там _всего_ лет..часов, всего минут и тп), а в нормальном - столько то лет..часов,минут и тп).

Сделал так:

Procedure Gu_Dt_TimeBetweenF(const time1,time2:tDateTime;var ve,ye,mo,n,d,c,m,s,ms:Word;checkWeek:Bool=false;checkTh:Bool=false);
var newt:tDateTime;
begin
ve:=0;ye:=0;mo:=0;n:=0;d:=0;c:=0;m:=0;s:=0;ms:=0;
if time2<=time1 then exit;newt:=time2-time1;
if int(newt)>0 then begin DecodeDate(newt, ye,mo,d);ye:=ye-1900;end;
DecodeTime(newt, c,m,s,ms);
if checkTh then if ye>100 then while ye>100 do begin dec(ye,100);inc(ve);end;
if checkWeek then if d>7 then while d>7 do begin dec(d,7);inc(n);end;
end;

use
...
Gu_Dt_TimeBetweenF(strtodatetime("10.12.1992 8:05:01"),strtodatetime("10.11.2112 9:04:03"),ve,ye,mo,n,d,c,m,s,ms,true,true);

ShowMessage("Веков: "+inttostr(ve)+" Лет: "+inttostr(ye)+" Месяцев: "+inttostr(mo)+" Недель: "+inttostr(n)+" Дней: "+
inttostr(d)+" Часов: "+inttostr(c)+" Минут: "+inttostr(m)+" Секунд: "+inttostr(s)+" Мс: "+inttostr(ms));
...

Вопросы:
1. все ли тут верно
2. учитываются ли тут високосные года
3. правильно ли считаются века и недели

Вроде все работает, но терзают смутные сомнения после прочтения всяких "добавьте 1 милисекунду чтобы правильно работало" и вообще опух уже с этими датами разбираться :( Может что то тут не верно?


 
Gu   (2011-12-10 09:50) [1]

наверно все же надо заменить ye>100 и d>7 на ye>=100 и d>=7


 
Gu   (2011-12-10 10:07) [2]

ver 0.2
begin
ve:=0;ye:=0;mo:=0;n:=0;d:=0;c:=0;m:=0;s:=0;ms:=0;
if time2<=time1 then exit;newt:=time2-time1;
if int(newt)>0 then begin DecodeDate(newt, ye,mo,d);Dec(ye,1900);
if checkWeek then if d>=7 then while d>=7 do begin dec(d,7);inc(n);end;
if n>=4 then while n>=4 do begin dec(n,4);inc(mo);end;
if mo>=12 then while mo>=12 do begin  dec(mo,12);inc(ye);end;
if checkTh then if ye>=100 then while ye>=100 do begin dec(ye,100);inc(ve);end;
end;
DecodeTime(newt, c,m,s,ms);
end;


 
Ega23 ©   (2011-12-10 10:56) [3]

var
 dt1, dt2: TDateTime;
 aYear, aMonth, aDay: Word;
begin
 DecodeDate(dt2-dt1, aYear, aMonth, aDay);
end;


 
Inovet ©   (2011-12-10 12:31) [4]

> [2] Gu   (10.12.11 10:07)
> if d>=7 then while d>=7 do begin dec(d,7);inc(n);end;

и т.п. - это ужасть. Открой для себя div и mod. Это не говоря уже о том - зачем вообще так изголятся, когда есть библиотечные функции.


 
Gu   (2011-12-10 13:33) [5]

пример приведи


 
Inovet ©   (2011-12-10 14:18) [6]

> [5] Gu   (10.12.11 13:33)
> пример приведи

Пример чего? Замену твоей функции Ега показал. О div и mod в справке написано. Если вот этоn
> [2] Gu   (10.12.11 10:07)
> if d>=7 then while d>=7 do begin dec(d,7);inc(n);end;
и иже с ним

n := d div 7
d := d mod 7

ты вот когда циклы писал для вычисления остатка не задумался о том, что может это как-то уже должно делаться по человечески? Или только тебе такое понадобилось? А если там не 7, 12, 365 (366), а 100500 чего-то, то ты бы так же в цикле отнимал?


 
Gu   (2011-12-10 20:01) [7]


> Замену твоей функции Ега показал

особой замены я не заметил


> не задумался о том


нет, в данном случае меня интересует только алгоритм и то что спрашивал, тут меня не интересует за сколько тактов это сделает проц, тем более что все операции он делает сложением и потратит он 1 или 2 микросекунды - тут меня не волнует. див и мод заменю, но в остальном замечания есть?


 
Inovet ©   (2011-12-10 20:16) [8]

> [7] Gu   (10.12.11 20:01)
> тем более что все операции он делает сложением

Да ты чё. Умножение он значит делает тоже сложением в цикле?

> [7] Gu   (10.12.11 20:01)
> в данном случае меня интересует только алгоритм и то что спрашивал

Спрашивал ты

> [0] Gu   (10.12.11 09:41)
> не в тех форматах, которые dateutils дает (там _всего_ лет..часов,
> всего минут и тп), а в нормальном - столько то лет..часов,
> минут и тп).

Скажи, что именно тебя не устраивает в библиотечных функциях? Вот такая допустим что преобразует не так как надо с учётом ответа Ега
procedure DecodeDateTime(const AValue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word);


 
Ega23 ©   (2011-12-10 20:16) [9]


>  но в остальном замечания есть?


Ты действительно думаешь, что кто-то будет в этот аццкий Адъ вникать?


 
Inovet ©   (2011-12-10 20:26) [10]

> [3] Ega23 ©   (10.12.11 10:56)
> DecodeDate(dt2-dt1, aYear, aMonth, aDay);

Так, а что тут с високосными годами получается? Врать будет.


 
QAZ   (2011-12-10 21:36) [11]

TDateTime задуман для работы с датой как с обычным числом

разница:=дата1-дата2;
DecodeDateTime(разница....);


 
Inovet ©   (2011-12-10 21:52) [12]

> [11] QAZ   (10.12.11 21:36)

Автор ещё не ответил, что именно его не устраивает в таком преобразовании.


 
Anatoly Podgoretsky ©   (2011-12-10 21:54) [13]

> QAZ  (10.12.2011 21:36:11)  [11]

Только разница это уже не дата


 
Jeer ©   (2011-12-10 22:48) [14]


> надо получить время между датами, но не в тех форматах,
> которые dateutils дает (там _всего_ лет..часов, всего минут
> и тп), а в нормальном - столько то лет..часов,минут и тп).
>  


Полная шиза..


 
Германн ©   (2011-12-11 00:21) [15]


> Полная шиза..

Не. Полное неумение автора задать вопрос, плюс почти полное нежелание отвечающих вдуматься в вопрос при отвечании. Вот только седобородый АП уловил сей момент и выдал правильную реплику.


 
Inovet ©   (2011-12-11 00:32) [16]

> [15] Германн ©   (11.12.11 00:21)

Да вдумались, только что же надо получить в итоге - автор сам не знает, похоже.


 
DVM ©   (2011-12-11 00:39) [17]


> Gu   (10.12.11 09:41)  


> Сделал так:
>


> 2. учитываются ли тут високосные года

Это тебя надо спрашивать, учитываются или нет. Ты ж сделал.


 
Германн ©   (2011-12-11 00:43) [18]


> Inovet ©   (11.12.11 00:32) [16]
>
> > [15] Германн ©   (11.12.11 00:21)
>
> Да вдумались, только что же надо получить в итоге - автор
> сам не знает, похоже.
>

Знает, только сказать не может так, что бы его поняли все.

> ShowMessage("Веков: "+inttostr(ve)+" Лет: "+inttostr(ye)+"
> Месяцев: "+inttostr(mo)+" Недель: "+inttostr(n)+" Дней:
> "+
> inttostr(d)+" Часов: "+inttostr(c)+" Минут: "+inttostr(m)+"
> Секунд: "+inttostr(s)+" Мс: "+inttostr(ms));

Да и собственно автор лишь просил "проверить" его самописную функцию. У меня нет свободного времени её проверять.


 
Германн ©   (2011-12-11 00:48) [19]

Ну и в добавок. Разница в дате/времени между двумя временными отсечками имеет смысл только в сутках, часах, минутах, секундах и т.д. по нисходящей. Всё остальное либо бред, либо враньё.
P.S. Да и количество суток тоже враньё.


 
Jeer ©   (2011-12-11 01:00) [20]


> Да и количество суток тоже враньё.


Договорились :)


 
DVM ©   (2011-12-11 01:02) [21]


> ("Веков: "+inttostr(ve)

С прицелом на далекое будущее проектируется функция. Нетленка можно сказать.


 
Inovet ©   (2011-12-11 01:11) [22]

> [19] Германн ©   (11.12.11 00:48)
> P.S. Да и количество суток тоже враньё.

Сутки зря прихватил - оставь.


 
Inovet ©   (2011-12-11 01:12) [23]

Недели тоже можно оставить.


 
Германн ©   (2011-12-11 01:50) [24]

Сутки - двойственное понятие. Так что не оставлю.


 
Jeer ©   (2011-12-11 02:02) [25]


> Германн ©   (11.12.11 01:50) [24]
>
> Сутки - двойственное понятие.


А время - вообще растяжимое понятие :)


 
Германн ©   (2011-12-11 02:17) [26]


> Jeer ©   (11.12.11 02:02) [25]
>
>
> > Германн ©   (11.12.11 01:50) [24]
> >
> > Сутки - двойственное понятие.
>
>
> А время - вообще растяжимое понятие :)
>

"что может быть проще, кроме времени?"
(с)  Клиффорд Симак.


 
Anatoly Podgoretsky ©   (2011-12-11 10:40) [27]

> Германн  (11.12.2011 02:17:26)  [26]

И только у программистов не понимание


 
SQLEX ©   (2011-12-11 11:02) [28]

сейчас решаем с дочерью задачу
1. Робинзон строил забор 10 дней
2. бла-бла на 20 дней дольше чем забор
3. бла-бла1 в два раза дольше чем бла-бла
4. Лодку на 2 месяца дольше чем бла-бла1
Сколько дней строил лодку?

и как решать?! :)) Повбывав бы...


 
Inovet ©   (2011-12-11 11:13) [29]

> [28] SQLEX ©   (11.12.11 11:02)
> и как решать?! :))

0. Робинзон начал строительство в Рождество хххх года.


 
QAZ   (2011-12-11 19:43) [30]


> Anatoly Podgoretsky ©   (10.12.11 21:54) [13]

пачиму нет


 
DVM ©   (2011-12-11 19:56) [31]


> QAZ   (11.12.11 19:43) [30]

Разница между двумя датами оторвана от начала отсчета 30 декабря 1899. Совершенно разные даты могут дать одну и ту же разницу в часах минутах и секундах. DecodeDateTime думает что отсчет ведется от 30 декабря 1899 и даст имеенно результат с учетом этого. Например для разницы неизвестно были ли високосные года между двумя датами.



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

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

Наверх




Память: 0.55 MB
Время: 0.009 c
15-1322425802
Юрий
2011-11-28 00:30
2012.03.25
С днем рождения ! 28 ноября 2011 понедельник


15-1322644551
И. Павел
2011-11-30 13:15
2012.03.25
Как праильно задать права на таблицу (MS SQL SERVER 2005)?


6-1254316524
Абрамов Игорь
2009-09-30 17:15
2012.03.25
Отправка почты Exchange Server


15-1322653876
Jeer
2011-11-30 15:51
2012.03.25
TList vs TList<T>


15-1322570922
OW
2011-11-29 16:48
2012.03.25
Откуда пробел?