Форум: "Начинающим";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
Внизпросьба проверить функцию Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.003 c