Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Predstaviti razliku dva datuma?

[es] :: Pascal / Delphi / Kylix :: Predstaviti razliku dva datuma?

Strane: 1 2 3

[ Pregleda: 8725 | Odgovora: 41 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.kalik.info.



Profil

icon Re: Predstaviti razliku dva datuma?30.01.2007. u 20:43 - pre 209 meseci
@viking13
Ok, trudim se da pažljivo pročitam svaki post.

Shvatam da tu ima, možda, zakonskih caka, etc., ali u ovom momentu meni treba samo ovo, rekao bih čisto rešenje, odnosno to su informacije koje imam:

Hipotetički, lice se zapošljava u neku ustanovu, recimo, ta ustanova zahteva od njega broj god, mes, dana radnog staža, ukupan koji je odradio - nebitni su datumi zasnivanja i prekida, firme gde je radio, koji donosi u ustanovu po zasnivanju radnog odnosa. Mi, ustanova, memorišemo te cifre i datum zasnivanja radnog odnosa. Teti iz kadrovske službe treba da, u svom programu, kad vrši pregled podataka o zaposlenom licu vidi donesen radni staž i datum zaposlenja u njihovoj instituciji. Trenutno joj ne treba ništa više nego radni staž (broj god, mes, dana) od dana zasnivanja radnog odnosa lica u toj instituciji do danas, plus staž sa kojim je lice došlo u instituciju, tako da dobijemo ukupan zbir.

BTW, raspitaću se malo, ukoliko ima nekih caka još na koje bih treba obratiti pažnju, javiću vam te ćemo korigovati, ali trenutno na ovome se zadržavam.

Hvala svima na diskusiji.


Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

milanescape
Kg

Član broj: 54988
Poruke: 50
*.ptt.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 01:46 - pre 209 meseci
Radni staz izracunavas tako sto izracunas broj dana od prvog datuma prve sledece godine (ne one u kojoj je prvi datum) do poslednjeg datuma pretposlednje godine (do 12-og meseca)-->d.Zatim izracunas koliko je bilo prestupnih godina u tom intervalu-->ne ukljucujuci prvu i poslednju-->n. Izracunas razliku d-n. Izracunas koliko je bili dana u prvoj godini (to je lako)-->d1, a zatim koliko je bilo dana u poslednjoj godini-->d2. (bilo da su prva i poslednja prestupne ili ne) ==> RS=d-n+d1+d2 na kraju sve podelis sa 365.
RS=(d-n+d1+d2)/365. Radni staz mozes pretstaviti u obliku decimalnog broja ili kao ceo broj i ostatak dana(ili meseci i dana). Broj dana se uglavnom u svim izracunavanjima vezuje za 30 . Ako sabiras vise intervala radnog staza onda ih sabiras kao decimalne brojeve (pojedinacno) i tek na kraju sve pretvaras u godine mesece i dane. U principu-ako su kratki intervali tipa od 02.02.2004 do 03.03.2004 onda pojedinacno racunas broj dana. Na kraju sve delis sa 365. Npr 4,53g RS : 4 g, 1:12=0,53:x==>6,36 mes==>6 m ---e sad moras da upotrebis 30 dana. 1:30=0,36:x ==> 10,8 dana.

Procedura koju saljem bi trebalo da radi-ali proveri. Nema bas neke veze sa ovim objasnjenjem. Koristio sam je ranije-i tad je to moglo tako. Moraces da ispravis deo oko konvertovanja dana (pod uslovom da radi- stvarno nisam stigao da proverim). Potrebna su ti dva edita, button i label, tabela sa poljima od i do, source. Petljom u edite (ili dbedite) iz tabele smestas datume(od-do). Labela pokazuje rezultat. Rezultat cuvas u posebnoj promenljivoj kojoj dodajes svaku novu vrednost (dane). na kraju delis sa 365 i pretvaras u G,M,D.



procedure BrojDana(s1, s2:string; var s: string);
var
datum1, datum2: TDateTime;
posebnodana,ukupdana,dana:real;
dan,prvidanuprvgod,zavrsnidanuzavrgod,
godina,ukupgodina,prvagodina,zavrsnagodina,
ukupmeseci,mesec,prvimesuprvgod,zavrsnimesuzavrsgod:integer;
var DanaUMesecu: array [1..12] of integer;

begin
dana:=0;
ukupgodina:=0;
ukupdana:=0;
posebnodana:=0;
ukupmeseci:=0;

DanaUMesecu[1]:=31;
DanaUMesecu[2]:=28;
DanaUMesecu[3]:=31;
DanaUMesecu[4]:=30;
DanaUMesecu[5]:=31;
DanaUMesecu[6]:=30;
DanaUMesecu[7]:=31;
DanaUMesecu[8]:=31;
DanaUMesecu[9]:=30;
DanaUMesecu[10]:=31;
DanaUMesecu[11]:=30;
DanaUMesecu[12]:=31;

datum1 :=strtodate(s1);
datum2 :=strtodate(s2);

dana :=datum2 - datum1; //ukupan broj dana -sluzi samo za poredjenje sa ukupdana ako ti je potrebno

//za godine koje nisu pocetna i zavrsna
prvagodina:=strtoint(s1[7]+s1[8]+s1[9]+s1[10]);
zavrsnagodina:=strtoint(s2[7]+s2[8]+s2[9]+s2[10]);
//za prvu godinu za broj meseci (i dana)-->posto nema puni broj godina
prvimesuprvgod:=strtoint(s1[4]+s1[5]);
zavrsnimesuzavrsgod:=strtoint(s2[4]+s2[5]);
//za preostali broj dana-->u prvom mesecu prve godine i u zavrsnom mesecu zavrsne godine
prvidanuprvgod:=strtoint(s1[1]+s1[2]);
zavrsnidanuzavrgod:=strtoint(s2[1]+s2[2]);

if zavrsnagodina-prvagodina<=1 then//ako su godine jedna do druge ili je ista godina
begin

if zavrsnagodina-prvagodina=0 then//ako je ista godina
begin
ukupgodina:=0;
if zavrsnimesuzavrsgod-prvimesuprvgod<=1 then//ako su dani u dva meseca koji su jedan do drugog ili su isti
begin

ukupmeseci:=ukupmeseci+0;
ukupdana:=ukupdana+datum2 - datum1;
posebnodana:=posebnodana+ukupdana;


end
else
begin
for mesec:=prvimesuprvgod+1 to zavrsnimesuzavrsgod-1 do
begin
ukupmeseci:=ukupmeseci+1;
if ((mesec=2)and (prvagodina mod 4 = 0)) then ukupdana:=ukupdana+29
else ukupdana:=ukupdana+DanaUMesecu[mesec];
end;
ukupdana:=ukupdana+DanaUMesecu[prvimesuprvgod]-prvidanuprvgod+zavrsnidanuzavrgod;
posebnodana:=DanaUMesecu[prvimesuprvgod]-prvidanuprvgod+zavrsnidanuzavrgod;
end;
end
else
begin
if zavrsnagodina-prvagodina=1 then//ako su godine jedna do druge
begin
ukupgodina:=0;
for mesec:=prvimesuprvgod+1 to 12 do
begin
ukupmeseci:=ukupmeseci+1;
if ((mesec=2)and (prvagodina mod 4 = 0)) then ukupdana:=ukupdana+29
else ukupdana:=ukupdana+DanaUMesecu[mesec];
end ;

//za zavrsnu godinu za broj meseci (i dana)-->posto nema puni broj godina

for mesec:=1 to zavrsnimesuzavrsgod-1 do
begin
ukupmeseci:=ukupmeseci+1;
if ((mesec=2)and (prvagodina mod 4 = 0)) then ukupdana:=ukupdana+29
else ukupdana:=ukupdana+DanaUMesecu[mesec];
end ;
posebnodana:=DanaUMesecu[prvimesuprvgod]-prvidanuprvgod;
posebnodana:=posebnodana+zavrsnidanuzavrgod-1;

ukupdana:=ukupdana+DanaUMesecu[prvimesuprvgod]-prvidanuprvgod;
ukupdana:=ukupdana+zavrsnidanuzavrgod-1;
end

end

end
else
begin//***************************
for godina:=prvagodina+1 to zavrsnagodina-1 do
begin
if godina mod 4 =0 then ukupdana:=ukupdana+366 else ukupdana:=ukupdana+365;//koliko dana u godinama izmedju prve (prvog datuma) i poslednje(poslednjeg datuma)
ukupgodina:=ukupgodina+1;
end;


for mesec:=prvimesuprvgod+1 to 12 do
begin
ukupmeseci:=ukupmeseci+1;
if ((mesec=2)and (prvagodina mod 4 = 0)) then ukupdana:=ukupdana+29
else ukupdana:=ukupdana+DanaUMesecu[mesec];
end ;


for mesec:=1 to zavrsnimesuzavrsgod-1 do
begin
ukupmeseci:=ukupmeseci+1;
if ((mesec=2)and (prvagodina mod 4 = 0)) then ukupdana:=ukupdana+29
else ukupdana:=ukupdana+DanaUMesecu[mesec];
end ;



posebnodana:=DanaUMesecu[prvimesuprvgod]-prvidanuprvgod;
posebnodana:=posebnodana+zavrsnidanuzavrgod-1;

ukupdana:=ukupdana+DanaUMesecu[prvimesuprvgod]-prvidanuprvgod;
ukupdana:=ukupdana+zavrsnidanuzavrgod-1;

end;//***************************

//ovo je varijanta gde se gleda 30 dana u mesecu (i standardnih 28 u februaru)-to moras proveriti!!!!
{if zavrsnimesuzavrsgod<>3 then
begin
if posebnodana>=30 then
begin
posebnodana:=posebnodana-30;
ukupmeseci:=ukupmeseci+1;
end;
end
else
begin

if posebnodana>=28 then
begin
posebnodana:=posebnodana-28;
ukupmeseci:=ukupmeseci+1;
end;

end;}
//ovo je varijanta gde se gleda poslednji mesec (broj dana u poslednjem mesecu)
if posebnodana>=DanaUMesecu[zavrsnimesuzavrsgod] then
begin
posebnodana:=posebnodana-DanaUMesecu[zavrsnimesuzavrsgod];
ukupmeseci:=ukupmeseci+1;
end;

{//ovo je varijanta gde se gleda prvi mesec (broj dana u prvom mesecu)
if posebnodana>=DanaUMesecu[prvidanuprvgod] then
begin
posebnodana:=posebnodana-DanaUMesecu[prvidanuprvgod];
ukupmeseci:=ukupmeseci+1;
end;}
if ukupmeseci>=12 then
begin
ukupgodina:=ukupgodina+1;
ukupmeseci:=ukupmeseci-12;
end;


s:=inttostr(ukupgodina)+ ' godina '+inttostr(ukupmeseci)+ ' meseci '+floattostr(posebnodana)+ ' dana';

end;


procedure TForm1.ButtonStazClick(Sender: TObject);
var t:string;
begin
BrojDana(editdat1.text,editdat2.text,t);//ili dbedit1.text, dbedit2.text
label1.caption:=t;//pokazuje rezultat
end;
MV
 
Odgovor na temu

mojeKorIme
BiH

Član broj: 59512
Poruke: 350
195.222.35.*



+1 Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 06:53 - pre 209 meseci
Nisam imao vremena da citam sve...Zelio bih da ti skrenem paznju da ima i prestupna godina. Pa ako to nisi
predvidio kompletiraj kod. pozz.
Give me six hours to chop down a tree and I will spend the first four sharpening the axe.
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 09:34 - pre 209 meseci
Citat:
loshmiscg
Dakle, ako već imam br.god = 5, br.mes = 10, br.dan = 12, a posle obračuna između dva datuma dobijem u nekim promenljivama br.god = 10, br.mes = 5, br.dan = 23, hteo bih to sabrati i dati konačan izveštaj. Nije problem sabrati nego rastaviti, kad se sabere: br.god = 15, br.mes = 15, br.dan = 35, sad to treba rastaviti na br.god = 16, br.mes = 4, br.dan = (4 ili 5)!?!

Teti iz kadrovske službe treba da, u svom programu, kad vrši pregled podataka o zaposlenom licu vidi donesen radni staž i datum zaposlenja u njihovoj instituciji. Trenutno joj ne treba ništa više nego radni staž (broj god, mes, dana) od dana zasnivanja radnog odnosa lica u toj instituciji do danas, plus staž sa kojim je lice došlo u instituciju, tako da dobijemo ukupan zbir.


Što se tiče prebacivanja zbira dana u mesec + broj dana, ja lično mislim da treba uzeti u obzir broj dana u prethodnom mesecu od tekućeg.

Za mesece i godine nema dileme.

U skladu sa ovim i tvojim kodom sledeće 3 linije rade čitav posao:

Code:

 DMYBetween(ANow, AThen, Days, Months, Years);
 AThen :=  IncYear(IncMonth(IncDay(ANow, -Days-d), -Months-m), -Years-y);
 DMYBetween(ANow, AThen, Days, Months, Years);


Znači tekući datum umanjiš za dobijeni broj godina, meseci i dana i vidiš kolika je razlika sa sadašnjim datumom (da bi ti dane računao u odnosu na prethodni mesec).

-off topic-
Ja samo ne mogu da shvatim zašto ljudi vole da komplikuju i da izmišljaju toplu vodu. Bolje imati 2000 linija koda nego 3, jer to pokazuje da si više radio?
viking ®
 
Odgovor na temu

milanescape
Kg

Član broj: 54988
Poruke: 50
*.ptt.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 12:42 - pre 209 meseci
"Ja samo ne mogu da shvatim zašto ljudi vole da komplikuju i da izmišljaju toplu vodu. Bolje imati 2000 linija koda nego 3, jer to pokazuje da si više radio? "

Vise radio!!!! JEL TO NEKI KOMPLEKS? STA?

Ja stvarno (DAKLE STVARNO) ne razumem ljude koji sa "premalo reci" previse pametuju !!!!
Zasto ne pimeniti te tri linije koda u resiti coveku problem???!!!. Voleo bih da vidim to resenje bez dodatne korekcije. Ja licno mislim da problem moze da se resi sa par linija koda (ne vise od 10) ali me mrzi da radim nesto sto sam ranije vec odradio (na ovaj ili onaj nacin).

"ja lično mislim da treba uzeti u obzir broj dana u prethodnom mesecu od tekućeg."

Nema sta tu da se misli. Postoji tri nacina racunanja radnog staza [TACNIJE RACUNANJA RAZLIKE IZMEDJU DVA DATUMA] (sve sam ih naveo). Trenutno se RS izracunava SIGURNO tako sto se izracuna broj PUNIH GODINA broj PUNIH MESECI i preostali deo dana se pretvara u mesec ako je dana>30. Gde god se obratis za pomoc reci ce ti da nisu sigurni kako se to radi. Ali zato postoji matematicki postupak koji je napravljen mnogo pre nego je neko ovde uopste saznao za Delphi.

Dakle kome treba ovo je sigurno ispravno:
Izracunas koliko je bilo dana u prvoj godini d1
Izracunas koliko je bilo dana u poslednjoj godini d2
Izracunas broj punih godina i pretvoris u dane d (izmedju prve i poslednje godine)
Izracunas broj prestupnih godina n
RS=(d1+d2+d-n)/365
Moze i ovako ako neko zeli RS=(d1+d2+d+n)/366 (n je broj godina koje nisu prestupne)

Sadasnji postupak (validan) se svodi na ovaj primer: 4,53g RS :==> 4 g, 1:12=0,53:x==>6,36 mes==>6 m 1:30=0,36:x ==> 10,8 dana==>10 dana (ovo pretvoriti *U STO MANJE KODA*)

Ovo sve naravno moze da se skrati, malo koriguje postupak, ... ali okreni obrni sve se uvek svodi na ovo. Da li ce se to uraditi na ovaj ili onaj nacin svejedno je. Naravno bolje je koristiti vec definisane procedure ali I "bolje je bilo kakvo resenje danas nego super resenje sutra"

MV
 
Odgovor na temu

milanescape
Kg

Član broj: 54988
Poruke: 50
*.ptt.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 12:48 - pre 209 meseci
VISE VREMENSKIH INTERVALA SABIRAS ili kao BROJ DANA ili kao BROJ GODINA U OBLIKU DECIMALNOG ZAPISA.
KRAJNJI POSTUPAK JE ISTI.
Pozzzz
MV
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.kalik.info.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 12:50 - pre 209 meseci
OK, momci, polako ...
Verovatno ste obojiaca u pravu. Treba zajedno da nađemo relevantno rešenje, ne da se prepiremo, te u tom duhu nastavimo.

Polako nadolazimo do rešenja. Naime, procedura:
Code:

procedure DMYBetween(ANow, AThen: TDate; var Days, Months, Years: Integer);
begin
  Years := YearsBetween(ANow, AThen);
  AThen := IncYear(AThen, Years);
  Months := MonthsBetween(ANow, AThen);
  AThen := IncMonth(AThen, Months);
  Days := DaysBetween(ANow, AThen);
end;

ako je ANow = 31.12.2006 a AThen = 30.11.2006, za Days daje 1 a Months 1!?!
To je ok, ali šta kad se staž broji i taj 30.11.2006 kao radni, odnosno, rezultat koji mi treba u ovom slučaju je 1 mesec i 2 dana (32 dana).
Npr. ako je lice radilo samo jedan dan, od 30.11.2006 do 30.11.2006, dakle samo sedmočasovno vreme, recimo, treba rezultat da bude 1 dan?
Moglo bi možda ovde:
Code:

procedure TForm1.Button2Click(Sender: TObject);
var d,m,g,Days,Months,Years: integer;
    ANow, AThen: TDate;
begin
 d:= 0;//radni staz donet  (broj dana)
 m:= 0;//radni staz donet  (broj meseci)
 g:= 0;//radni staz donet  (broj godina)
 ANow:= StrToDate('31.12.2006');//postavka datuma
 AThen:= StrToDate('30.11.2006');//postavka datuma
 DMYBetween(ANow, AThen, Days, Months, Years);
 AThen :=  IncYear(IncMonth(IncDay(ANow, -Days-d), -Months-m), -Years-g);
 DMYBetween(ANow, AThen, Days, Months, Years);
 ShowMessage('Od ' + DateToStr(AThen) + ' do ' + DateToStr(ANow)+ ' ima: ' + IntToStr(Days) + ' dana; ' + 
                      IntToStr(Months) + ' meseci; ' + IntToStr(Years) + ' godina;');
end;

se to moglo korigovati!?!

@milanescape
I tvoj primer daje isti rezultat kao što sam gore naveo.

[Ovu poruku je menjao loshmiscg dana 31.01.2007. u 14:04 GMT+1]
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 13:42 - pre 209 meseci
Da se na početku razumemo, ne želim da se objašnjavam ni sa kim, niti da se inatim.

Citat:
milanescape: "Bolje imati 2000 linija koda nego 3, jer to pokazuje da si više radio? "

Vise radio!!!! JEL TO NEKI KOMPLEKS? STA?


Na kraju rečenice se nalazi UPITNIK, a to obično znači da je rečenica PITANJE! Znači, to nije moja tvrdnja nego pitanje.

Zamolio bih te da sledeći put prvo pročitaš šta sam napisao, da shvatiš šta sam hteo da kažem, pa tek onda da mi odgovoriš. Najljubaznije te to molim, a ako to ne želiš, onda je bolje da mi ne odgovaraš. Biće manje nepotrebih objašnjenja, kao što je ovo.

Citat:
milanescape:
Zasto ne pimeniti te tri linije koda u resiti coveku problem???!!!. Voleo bih da vidim to resenje bez dodatne korekcije. Ja licno mislim da problem moze da se resi sa par linija koda (ne vise od 10) ali me mrzi da radim nesto sto sam ranije vec odradio (na ovaj ili onaj nacin).


Poenta i jeste u tome da je moje rešenje NAJKRAĆE. Zato sam i pitao zašto dalje komplikovati.

Citat:
milanescape:
Gde god se obratis za pomoc reci ce ti da nisu sigurni kako se to radi.


E vidiš to i jeste najveći problem. Ni teta iz kadrovske kod mene u firmi nije sigurna kako se to radi.
viking ®
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 13:54 - pre 209 meseci
Citat:
loshmiscg: OK, momci, polako ...
ako je ANow = 31.12.2006 a AThen = 30.11.2006, za Days daje 1 a Months 1!?!
To je ok, ali šta kad se staž broji i taj 30.11.2006 kao radni, odnosno, rezultat koji mi treba u ovom slučaju je 1 mesec i 2 dana (32 dana).
Npr. ako je lice radilo samo jedan dan, od 30.11.2006 do 30.11.2006, dakle samo sedmočasovno vreme, recimo, treba rezultat da bude 1 dan?


Ako ti je to jedini problem u životu ti si srećan čovek. :)

DaysBetween računa samo ceo broj dana između dva datuma.

Znači rešenje je krajnje trivijalno:

Code:

procedure DMYBetween(ANow, AThen: TDate; var Days, Months, Years: Integer);
begin
  Years := YearsBetween(ANow, AThen);
  AThen := IncYear(AThen, Years);
  Months := MonthsBetween(ANow, AThen);
  AThen := IncMonth(AThen, Months);
  Days := DaysBetween(ANow, AThen) + 1;
end;

viking ®
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.kalik.info.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 14:56 - pre 209 meseci
U ovom slučaju, za datum AThen = 01.01.2007 a za ANow = 10.01.2007 rezultat je 11 dana, a to nije tačno.
A ako u ovom delu:
Code:
Days := DaysBetween(ANow, AThen)+1;

izbacimo +1, rezultat je 9, što opet nije korektno.
Tačan rezultat treba ispisati 10.

Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 15:27 - pre 209 meseci
Citat:
loshmiscg: ako je ANow = 31.12.2006 a AThen = 30.11.2006, za Days daje 1 a Months 1!?!
To je ok, ali šta kad se staž broji i taj 30.11.2006 kao radni, odnosno, rezultat koji mi treba u ovom slučaju je 1 mesec i 2 dana (32 dana).


Na osnovu ovoga sam shvatio da želiš da ti DMYBetween vrati m = 1, d = 2. Ako pozoveš funkciju videćeš da ona stvarno vraća to što si tražio.

Problem je što u kodu koji je koristi 2 puta imaš DMYBetween. Pa samim tim imaš dva puta korekciju i odatle ti dan viška.

Vrati DMYBetween na staro, a korekciju uradi ovde.

Code:

 DMYBetween(ANow, AThen, Days, Months, Years);
 inc(Days);
 AThen :=  IncYear(IncMonth(IncDay(ANow, -Days-d), -Months-m), -Years-g);
 DMYBetween(ANow, AThen, Days, Months, Years);


Jel sad sve ok? :)

viking ®
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.kalik.info.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 16:21 - pre 209 meseci
Mislim da je to to:

Za period ANow = 01.01.2007 i AThen = 01.01.2007 prikaže 1; - OK
Za period ANow = 01.01.2007 i AThen = 10.01.2007 prikaže 10; - OK
Za period ANow = 01.01.2007 i AThen = 01.01.2006 prikaže za dane 2 a za godinu 1; ???

Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

milanescape
Kg

Član broj: 54988
Poruke: 50
*.ptt.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 17:05 - pre 209 meseci
Ok. Necemo se prepirati. Ja samo ne razumem ljude koji zarad, pojma nemam cega, provociraju. "...Bolje imati 2000 linija koda nego 3, jer to pokazuje da si više radio? " Upitnik na kraju recenice ne ublazava ovo prethodno.
No uopste nije bitno. I ko je uopste ovde poredio duzinu koda. Nisam tvrdio da su tvoja resenja losa. Cak nisam tvrdio ni da je moja procedura potpuno ispravna jer nisam stigao da je proverim. Ja sam ranije radio program koji racuna broj godina radnog staza i to je procedura koja je nastala od ove-zato sam poslao ovo. Trenutno Cd na kojem se nalazi SIGURNO POTPUNO ISPRAVNA procedura nije kod mene inece bih proceduru poslao. Program je do PROSLE godine radio i niko se nije nesto bunio. Prosle godine po naredjenju "odozgo" dobili su nove programe za to. Moje misljenje je stvarno takvo da ako je coveku nesto hitno (a nekad moze biti), bolje mu pomoci koliko mozes, makar pomoc bila i losija nego mu uopste ne pomagati.
Jos na pocetku, rekao sam da je Savkic ponudio super resenje. Ako problem bolje sagledamo, na njegov kod (broj dana) dodas kod koji izracunava broj prestupnih godina i resio si gotovo ceo problem. Problem bi se sveo na RS=(d-n)/365 gde je n br.prest.god. Ono sto sam objasnio u vezi RS je na osnovu onoga sto sigurno znam.

No ukljucio sam se ne zbog "prethodnog" vec zbog ovog:

Matematicki to izgleda ovako (ALI OVDE NEMA NAGADJANJA NITI PRETPOSTAVKI-->100% JE TACNO):


ODUZIMANJE:
yyyy.mm.dd

|-->Ako je broj dana manji nego u staroj godini DODAJE SE BROJ DANA IZ PRETHODNOG MESECA
| (tacan broj dana prth. meseca,dakle ne 30)
|
2007.07.22
-2005.03.28
___________

==>

2007. 06. 22+30
-2005. 03. 28
___________________
2 g 3 m 24 d (ovo je metod koji se koristi godinama a smatra se ispravnim!)

SABIRANJE:
Ako ima vise ovakvih intervala:

g m d ===========>6 g 5 m + 57 dana (sad se koristi ono 30 dana)==> 6g 6m 27 dana
2 3 24
+ 3 2 21
+ 1 0 12
____________

Kod se moze smestiti u par redova-->ko ima vremena da pise.

Usput resenje ti je OK
Poz

Za Milosa: u radni staz ulazi uvek i prvi i poslednji upisani dan-to je sigurno. Nisam ostalo procitao-moguce je da ste sve priveli kraju. U svakom slucaju sve naj sa tim programom.
Poz

Ovu poruku je menjao milanescape dana 31.01.2007. u 18:19 GMT+1]



[Ovu poruku je menjao milanescape dana 31.01.2007. u 21:52 GMT+1]
MV
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 17:20 - pre 209 meseci
Citat:
loshmiscg: Mislim da je to to:

Za period ANow = 01.01.2007 i AThen = 01.01.2007 prikaže 1; - OK
Za period ANow = 01.01.2007 i AThen = 10.01.2007 prikaže 10; - OK
Za period ANow = 01.01.2007 i AThen = 01.01.2006 prikaže za dane 2 a za godinu 1; ???


Malo prepravljena funkcija:

Code:

procedure DMYBetween(ANow, AThen: TDate; var Days, Months, Years: Integer);
begin
  AThen := IncDay(AThen, -1);
  Years := YearsBetween(ANow, AThen);
  AThen := IncYear(AThen, Years);
  Months := MonthsBetween(ANow, AThen);
  AThen := IncMonth(AThen, Months);
  Days := DaysBetween(ANow, AThen);
  dec(Days);
end;


Za period ANow = 01.01.2007 i AThen = 01.01.2007 vraća 0, 0, 0
Za period ANow = 01.01.2007 i AThen = 10.01.2007 vraća 9, 0, 0
Za period ANow = 01.01.2007 i AThen = 01.01.2006 vraća 0, 0, 1

Ovo su realne razlike, što znači da funkcija konačno radi kako treba.

E sad, treba dodati jedan dan za tekući radni staž (da bi se računao i taj prvi dan, a ne samo razlika).

Posle ovog koda:

Code:

 DMYBetween(ANow, AThen, Days, Months, Years);
 inc(Days);
 AThen :=  IncYear(IncMonth(IncDay(ANow, -Days-d), -Months-m), -Years-g);
 DMYBetween(ANow, AThen, Days, Months, Years);


Za period ANow = 01.01.2007 i AThen = 01.01.2007 dobićeš 1, 0, 0
Za period ANow = 01.01.2007 i AThen = 10.01.2007 dobićeš 10, 0, 0
Za period ANow = 01.01.2007 i AThen = 01.01.2006 dobićeš 1, 0, 1

Razlika jeste tačno godinu dana, ali ako se računa i prvi dan to je onda jedan dan više.

Za period ANow = 31.12.2006 i AThen = 01.01.2006 dobićeš 0, 0, 1 odnosno tačno godinu dana.
viking ®
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 17:59 - pre 209 meseci
Pošto vidim da si spustio loptu, red je da i ja to uradim. :)

Ako si se osetio prozvanim, ja ti se izvinjavam.

Što se tiče provociranja, evo ga savkic ziv i zdrav ovde, pa nek proba da se seti da li sam ja ikada provocirao bilo koga na yu.prog.delphi.

Što se tiče tvog koda, array DanaUMesecu mi neverovatno bode oči. Ali i sam kažeš da je procedura stara, tako da je moguće da si je pravio i pre nego što je napravljen DateUtils unit.

Citat:

Moje misljenje je stvarno takvo da ako je coveku nesto hitno (a nekad moze biti), bolje mu pomoci koliko mozes, makar pomoc bila i losija nego mu uopste ne pomagati.


Zato sam i napisao proceduru da bi pomogao čoveku.

U želji da čovek što pre dobije rešenje sam i počeo da brljam, al sam sve ispeglao na kraju. :)

Citat:

ODUZIMANJE:
yyyy.mm.dd

|-->Ako je broj dana manji nego u staroj godini DODAJE SE BROJ DANA IZ PRETHODNOG MESECA
| (tacan broj dana prth. meseca,dakle ne 30)
|
2007.07.22
-2005.03.28
___________

==>

2007. 06. 22+31
-2005. 03. 28
___________________
2 g 3 m 25 d (ovo je metod koji se koristi godinama a smatra se ispravnim!)


Apsolutno se slažem sa tobom, sem po pitanju rezultata. :)

Test datum ti je 2007.07.22, što znači da je prethodni mesec jun koji ima 30 dana, a ne 31.

Znači pravi rezultat dobijen ovim metodom je 2 g 3 m i 24 d.

DMYBetween kao rezultat daje takođe 2 g 3 m i 24 d.

Citat:

Za Milosa: u radni staz ulazi uvek i prvi i poslednji upisani dan-to je sigurno. Nisam ostalo procitao-moguce je da ste sve priveli kraju. U svakom slucaju sve naj sa tim programom.


Obzirom na test rezultate, ima kompletno rešenje sa sve uključenim tim prvim danom.
viking ®
 
Odgovor na temu

milanescape
Kg

Član broj: 54988
Poruke: 50
*.ptt.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 20:28 - pre 209 meseci
Ma ok je. Nisam zlopamtilo.
Procedura je napravljena pre 6 god, otprilike. Nije bio u pitanju DateUtils vec skoro isti problem o kojem smo diskutovali u ovoj temi-masa pribliznih vrednosti i ni na jedno da se oslonis a kratak rok za izradu-nema vremena za eksperimentisanje. E onda sam odlucio da proceduru napravim sam, sto inace uvek uradim kad me iznervira neka od ponudjenih proc. ili funkc. Slicno sam uradio i sa onim kodom za tzv "zastitu progr.". Glupo jeste i staromodno (j-ga), ali ja sam onda sigurniji u rezultat i to je to. Inace promenljive u proceduri su bile krace tipa g,m,d,,pd.zd.. pa sam ih ja na brzinu (replace) sinoc izmenjao i poslao-samo zbog razumljivosti-sto opet naravno ne moze da smanji kod niti da ga ulepsa jer je takav kakav je-inace je napravljen brzo i nikad vise nisam stigao ni da ga pregledam ni da ga proverim. U stvari da ne davim previse, kod sam inace poslao usput. Prevashodni cilj mi je bio da objasnim kako se racuna rad. staz.

>"Test datum ti je 2007.07.22, što znači da je prethodni mesec jun koji ima 30 dana, a ne 31."

Da.Ok. Ovo je bio previd- (cilj mi je bio da uzmem za primer mesec koji ima 31 a ne 30 dana i u brzini sam uzeo pogresan)- u pravu si, jun ima 30 dana.

>"DMYBetween kao rezultat daje takođe 2 g 3 m i 24 d."
...
>"Obzirom na test rezultate, ima kompletno rešenje sa sve uključenim tim prvim danom."

Ok ti je kod, i dobar.
Ali moras priznati-svi na pocetku tvrde da "to" moze u dva tri koraka i na kraju kad stvarno "stavis karte na sto" i stvarno sagledas problem, uvek ispadne makar duplo. A realno, za filovanje koda nikad nema vremena.

Nije mi bio cilj da se prepiremo-inace nisam taj tip i stvarno verujem da si ok programer
Izvinjenje svima koji nisu duzni da citaju "nepotrebno"

& naravno izmenicu ovo zbog onih koji ce ovo nekada iskoristiti

2007.07.22
-2005.03.28
___________
==>
2007. 06. 22+30
-2005. 03. 28
_____________
2 g 3 m 24 d

g m d ===========>6 g 5 m + 57 dana (sad se koristi ono 30 dana)==> 6g 6m 27 dana
2 3 24
+ 3 2 21
+ 1 0 12
_______

& poz

[Ovu poruku je menjao milanescape dana 31.01.2007. u 22:04 GMT+1]
MV
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.dynamic.sbb.co.yu.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 22:41 - pre 209 meseci
Citat:

Ali moras priznati-svi na pocetku tvrde da "to" moze u dva tri koraka i na kraju kad stvarno "stavis karte na sto" i stvarno sagledas problem, uvek ispadne makar duplo. A realno, za filovanje koda nikad nema vremena.


Čim se spomene datum, ja prvo ukucam uses DateUtils, pa tek onda počnem da razmišljam. :)

Cilj mi je bio da ljudima koji ne koriste taj unit skrenem pažnju na njega.

Za funkciju tipa izračunaj razliku dva datuma (i predstavi je kako god ti padne na pamet), i ma kako da je odradiš ne može da bude mnogo koda. Posebno ako koristiš DateUtils.


--off topic--
Moj biviš direktor mi je ispričao jednu fantastičnu priču vezanu za količinu koda.

U zemlji Srbiji pre ne znam ni ja koliko godina neko "pametan" je smislio da i programeri treba da imaju normu. Kako programeru odrediti normu, pa prema broju linija koda!?

Šta misliš šta je bilo prvo što su programeri zahvaćeni time uradili?

Napravili program koji generiše X (broj propisan normom) linija koda. :)

A onda lepo objasnili nadređenom: "Ja sam normu ispunio, sad me pusti da radim."

viking ®
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.kalik.info.



Profil

icon Re: Predstaviti razliku dva datuma?31.01.2007. u 23:32 - pre 209 meseci
Pozdrav dobri ljudi,

želim prvo da Vam se zahvalim, svima, jer ste mi u najkraćem roku pomogli rešiti problem.

@viking13
Da, tvoja prerađena procedura i drugi deo koda koji je koristi urodile su plodom. Probao sam na par primera, datuma, ali moram još malo je istestirati, pre puštanja u rad, pa ako budem imao još neko pitanje postaviću ga već.

Sve najbolje,
Miloš.
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

inherited
Novi Sad

Član broj: 95516
Poruke: 219
212.200.179.*



Profil

icon Re: Predstaviti razliku dva datuma?02.02.2007. u 17:37 - pre 209 meseci
Da se malo nadovezem, na osnovu ovih primera kako bi mogao od danasnjeg datuma odrediti datum za n meseci?
Unese se datum u jedan maskedit a u edit broj meseci pa u trecem editu dobijemo datum.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Predstaviti razliku dva datuma?02.02.2007. u 17:57 - pre 209 meseci
> Da se malo nadovezem, na osnovu ovih primera kako bi mogao od danasnjeg datuma odrediti datum za n meseci?
> Unese se datum u jedan maskedit a u edit broj meseci pa u trecem editu dobijemo datum.

IncMonth?
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Predstaviti razliku dva datuma?

Strane: 1 2 3

[ Pregleda: 8725 | Odgovora: 41 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.