Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1322570922
OW
2011-11-29 16:48
2012.03.25
Откуда пробел?


2-1323374485
Gu
2011-12-09 00:01
2012.03.25
Openfolder


11-1242542465
hroot
2009-05-17 10:41
2012.03.25
Anchors &amp; wsMaximized


2-1323308405
tj.nelson
2011-12-08 05:40
2012.03.25
Помогите разобратся с DayOfTheWeek


15-1322318218
DVM
2011-11-26 18:36
2012.03.25
Через 15 минут на Марс стартует ракета с марсоходом Curiosity





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский