Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

Gu ©   (2011-12-10 09:41:00) 

надо получить время между датами, но не в тех форматах, которые 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 милисекунду чтобы правильно работало" и вообще опух уже с этими датами разбираться :( Может что то тут не верно?


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

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

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


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

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

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


Ega23   (2011-12-10 20:16:00) [23]


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


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


Inovet   (2011-12-10 20:16:00) [24]

> [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);


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


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

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


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


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


Inovet   (2011-12-10 14:18:00) [26]

> [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 13:33:00) [27]

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


Inovet   (2011-12-10 12:31:00) [28]

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

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


Ega23   (2011-12-10 10:56:00) [29]

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


Gu   (2011-12-10 10:07:00) [30]

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;


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо