[ FireProxy @ 15.12.2004. 10:03 ] @
Da li neko ima ideju kako da resim sledeci problem......
date1 je ulazni parametar kada se neka aplikacija startovala (TDateTime)
date2 je ulazni parametar kada se ista aplikacija ugasila (TDateTime)
difference je broj godina, meseci, dana, sati, minuta. To jest koliko je gore pomenuta aplikacija radila.

U Delphi 7 nema TimeSpam, pa me interesuje neko drugo resenje....


Hvala.
[ sasas @ 15.12.2004. 10:22 ] @
Probaj sa

difference := Date2 - Date1; // ako zelis difference u datetime formatu

Imas i funkcije

YearsBetween .... Months, Weeks, Days, Hours, Minutes .... SecondsBetween

ss.
[ FireProxy @ 15.12.2004. 10:43 ] @
Nisam bas siguran da to radi........
Code:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    date1, date2, difference  :  TDateTime;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
date1 := Now;
Label1.Caption := DateTimeToStr(date1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
date2 := Now;
Label2.Caption := DateTimeToStr(date2);
difference := date2 - date1;
Label3.Caption := DateTimeToStr(difference);
end;

end.


[ sasas @ 15.12.2004. 10:58 ] @
Radi ... ali ti koristi samo za vreme (jer datum se prikazuje od 31.12.1899).
Preporucujem ti u svakom slucaju ove druge funkcije.
Alternativno mozes da koristis DecodeDateTime funkciju, pa da 'rucno' oduzimas.

ss.
[ broker @ 15.12.2004. 11:06 ] @
Ovako mozes da dobijes proteklo vreme u minutima

Code:

   StartDT := DateTimeToTimeSTamp (StartDateTime);
   EndDT := DateTimeToTimeSTamp (EndDateTime);
   Duration := ((EndDT.Date - StartDT.Date) * 60) +
                   ((EndDT.Time - StartDT.Time) / 1000 / 60)


[ FireProxy @ 15.12.2004. 11:18 ] @
mislio sam da postoji neki TimeSpam ili tako nesto.... .da ne lomim na ruke..... Hvala u svakom slucaju........ ili sto bi rekao Patak Daca : "Hvala ni za sta....." :)
[ sasas @ 15.12.2004. 11:21 ] @
nema na cemu :) uvek smo tu sa netacnim, nepotpunim i beskorisnim savetima ;)

ss.
[ neor @ 15.12.2004. 12:26 ] @
Probaj ovako:

difference := date1 - date2 - 693959.0;

[Ovu poruku je menjao neor dana 15.12.2004. u 13:57 GMT+1]
[ bancika @ 15.12.2004. 12:27 ] @
zar ne moze samo da napravis razliku. TDateTime je nisa drugo do real tip, kad oduzmes dobices broj dana koji aplikacija radi i vreme je u razlomljenom delu.
Code:
 
  showMessage(FormatDateTime('DD days HH hours MM minutes and SS seconds', Now - StartDate))

trebalo bi da radi
[ FireProxy @ 15.12.2004. 13:02 ] @
Citat:
neor: Probaj ovako:

difference := date1 - date2 - 693959.0;

[Ovu poruku je menjao neor dana 15.12.2004. u 13:57 GMT+1]


Jesi li probao?
Znas li sta se desi nakon jednog dana? nakon 24h?
[ sasas @ 15.12.2004. 13:13 ] @
A i meni je izgledalo kao dobra ideja.

@bancika: ne moze, jer datum ne pocinje od 0.0.0000 nego od 31.12.1899 tako da prosto oduzimanje ne dela. Zato je uveo neor ovu konstantu (malo uvecani DateDelta), ali ocigledno ne radi - ne vrti dane unapred.

ss.
[ neor @ 15.12.2004. 15:20 ] @
Eh, datum stalno stoji na nuli :(
Sto je u stvari nedozvoljena vrednost za datum

[ morlic @ 15.12.2004. 18:12 ] @
Probaj ovo:

Code:

procedure TimeSpan(StartDate, EndDate: TDateTime; Var Days, Hours, Min, Secs: integer);
Var
  temp: double;
begin
  Secs:= SecondsBetween(EndDate,StartDate);
  temp:= Secs / 86400;
  Days:= Trunc(temp); // Dani

  Secs:= Secs-(Days*86400);
  temp:= Secs / 3600;
  Hours:= Trunc(temp); // Sati

  Secs:= Secs-(Hours*3600);
  temp:= Secs/60;
  Min:= Trunc(temp); // Minuti

  Secs:= Secs-(Min*60); // Sekunde
end;

testiranje:

procedure TForm.Button1Click(Sender: TObject);
Var 
  Days, Hours, Min, Secs: integer;
begin
  TimeSpan(Now-5.5, Now, Days, Hours, Min, Secs);
  Caption:= Format('Razlika -> Dana: %d  Sati: %d  Minuta: %d Sekundi: %d', [Days, Hours, Min, Secs])
end;


Moguca je greska spod sekunde u duzim intervalima itd. Procitaj dokumentaciju za TDateTime ako te zanima detaljnije. Delphi ima unit DateUtils...
[ bancika @ 15.12.2004. 20:22 ] @
cekaj, jasno da dani ne pocinju od 000, ali...

(a + delta) - (b + delta) = a - b

zar ne..tako da od kad god da pocinje, razlika mora da bude ista
[ -zombie- @ 16.12.2004. 08:48 ] @
koliko buke oko sitnice..

jednostavno oduzmi početno od krajnjeg vremena, i prikaži to sa:

Code:
Label3.Caption := TimeToStr(difference);


eventualno ako će intervali biti duži od 24h, samo dodaj i dane ispred:

Code:
Label3.Caption := IntToStr(Trunc(difference))+' days '+TimeToStr(difference);



ispisivanje "aplikacija je radila mesec dana" je besmisleno, jer to ništa ne znači. šta je "mesec dana"? 30 dana? 31? 28/29? ili možda 30.4366...

zato se to i ne radi tako kako si zamislio.. pogledaj recimo kako vreme ispisuje task manager.. ili network connection status dialog.. ili..
[ FireProxy @ 16.12.2004. 10:03 ] @
Citat:
-zombie-: koliko buke oko sitnice..

ispisivanje "aplikacija je radila mesec dana" je besmisleno, jer to ništa ne znači. šta je "mesec dana"? 30 dana? 31? 28/29? ili možda 30.4366...

..


To sto ti je besmisleno je upravo ono sto ja hocu da pokusam da odradim...... Bas hocu da znam da izracunam koja godina i koji mesec ima koliko dana i na osnovu toga parsiram rezultat. Za moju aplikaciju je veoma bitno da prikaze da je radila npr. 1 godina, 6 meseci, 15 dana, 13 sati, 48 minuta i 56 sekundi. U krajnjem slucaju i da je besmisleno shvati to kao vezbu......
[ broker @ 16.12.2004. 10:08 ] @
FireProxy pa dobio si dovoljno razlicitih ideja, sad mozes da vezbas :)
Nazalost, nema gotovo resenje.
[ FireProxy @ 16.12.2004. 10:17 ] @
Pogresno si me shvatio...... ja ne trazim odgovor na pitanje..... otvorio sam diskusiju i nista vise....... na svim odgovorima hvala u svakom slucaju....... hteo sam da sagledam problem i iz drugog (necijeg) ugla.

Pozdrav svima.

P.S. Ako sam zvucao kao neko ko ocajnicki trazi da mu se resi problem i ko oce kod bez motike izvinjavam se.
[ -zombie- @ 16.12.2004. 12:25 ] @
Citat:
FireProxy:
Za moju aplikaciju je veoma bitno da prikaze da je radila npr. 1 godina, 6 meseci, 15 dana, 13 sati, 48 minuta i 56 sekundi. U krajnjem slucaju i da je besmisleno shvati to kao vezbu......


baš me zanima za kakvu to aplikaciju to može da bude bitno.. a uostalom, i kao vežba je besmisleno.. evo ti pa vežbaj:

Proces A je radio od 1. januara u 00:00:00 tačno 29 dana, 0 sati, 0 minuta i 0 sekundi
Proces B je radio od 1. februara u 00:00:00 tačno 29 dana, 0 sati, 0 minuta i 0 sekundi.

moj program će ispisati:
Proces A je radio 29 dana, 00:00:00
Proces B je radio 29 dana, 00:00:00

tvoj će ispisati:
Proces A je radio 29 dana, 00:00:00
Proces B je radio 1 mesec, 0 dana, 00:00:00

(i to samo ako godina nije prestupna)

dakle, ubedi me da je ovo drugo poželjan (pravilan) izlaz bilo kog programa..
[ bancika @ 16.12.2004. 13:18 ] @
mozda sam ja glup pa ne shvatam sustinu problema. Sad sam otkucao da vidim zasto bi razlika od 1900 godina nesto znacila i pogodite - ne znaci nista. Posle startovanja aplikacije sam menjao sistemsko vreme za par sati, dana godina unapred i radilo je savrseno. pa da pitam ja jos jednom: u cemu je problem kod ove trivijalne stvari?

evo i koda:

Code:

var
  StartTime: TDateTime;

procedure TForm1.FormCreate(Sender: TObject);
begin
  StartTime := Now;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := 'Program radi ' + IntToStr(Trunc(Now - StartTime)) + ' dana ' + FormatDateTime('HH "sati" MM "minuta" SS "sekundi"', Now - StartTime);
end;
[ FireProxy @ 16.12.2004. 13:48 ] @
Ovo gubi svaki smisao..... neki su svadjalacki nastrojeni......

Ovo mi je drugi put da postujem nesto pod ovu kategoriju i opet sam se pokajao.
Najljubaznije hvala svima koji su ucestvovali u raspravi i toliko od mene.

Drugarski pozdrav (smislen ili besmislen......odlucite sami)
[ sasas @ 16.12.2004. 14:07 ] @
Citat:
Ovo gubi svaki smisao..... neki su svadjalacki nastrojeni......


E, ***i ga, oterasmo coveka. Daj zombi iskuliraj malo, ako je covek vec precizno definisao problem nema potrebe da mu solimo pamet kako mu je ideja glupa...

ss.
[ bancika @ 16.12.2004. 14:25 ] @
Citat:
FireProxy: Ovo gubi svaki smisao..... neki su svadjalacki nastrojeni......


nadam se da nisi mislio na mene, ja sam zbunjeniji od dva ludaka u buretu
[ broker @ 16.12.2004. 15:36 ] @
Nema veze, ljudi se potrude da mu pomognu da resi problem a on im vraca sa "hvala ni za sta" a onda jos kaze i da je on to eto pitao tako reda radi da nesto pita... :)
[ FireProxy @ 16.12.2004. 15:46 ] @
Ta moja sala "hvala ni za sta" je bila upucena sasa-su sto je on i shvatio kao salu i u istom duhu mi odgovorio. Ne pravim se pametan i ne postavljam pitanje zato sto sve znam ili se pravim da sve znam pa kao da tebe broker-u preslisam...... Zna se zasto se postavljaju pitanja i otvaraju diskusije. Ne znam zasto moji post-ovi ovde generisu toliko negativne energije kod nekih clanova......
[ bancika @ 16.12.2004. 18:44 ] @
nisi ti kriv, pitanje ti je na mestu...da si znao, ne bi pitao, jelte.
cudno mi je kako se tolika buka digla oko nicega, ljudi su slali primere ok. odjednom se pojavise one cudne konstante, teorije i sl.
i kao slag na tortu neko rece da i dalje nema resenja...funny, isn't it
[ Peke @ 17.12.2004. 12:47 ] @
E sta vam bi daj da resimo ovo.
Jos jedno resenje, nije optimizovano ali radi
Code:
Function ConvertMSToTime(MS: Integer):String;
Var
  Hr, Min,Sec: Integer;
Begin
  ms:= Trunc(ms/1000);
  hr  := trunc(ms/3600);
  min := trunc((ms-(hr*3600))/60);
  Sec := ms-((hr*3600)+(min*60));
  If min < 10 Then
    Result := intToStr(hr)+':0'+intToStr(Min)+':'
  Else
    Result := intToStr(hr)+':'+intToStr(Min)+':';
  If sec < 10 then
    Result := Result+'0'+intToStr(sec)
  else
    Result := Result+intToStr(sec);
End;

Function Traje(Vreme: TTimeStamp):String;
Begin
  Result := IntToStr(Vreme.Date)+' Dana i '+ConvertMSToTime(Vreme.Time);
End;


Dodaj DateUtils u USES. Ovaj primer uporedjuje datum kada je exe snimljen na HDD sa trenutnim datumom.

Evo i kako ces testirati:
Code:

procedure TForm1.Button1Click(Sender: TObject);
var
  Proslo: TTimeStamp;
begin
  Proslo := MsecsToTimeStamp(MillisecondsBetween(now,FileDateToDateTime(FileAge(application.ExeName))));
  MessageDlg('Program radi: '+Traje(proslo), mtInformation, [mbOK], 0);
end;


Nadam se da sam pomogao I nema svadje niko nikog ovde netera da odgovori zar ne?
[ -zombie- @ 17.12.2004. 16:03 ] @
Citat:
sasas:
E, ***i ga, oterasmo coveka. Daj zombi iskuliraj malo, ako je covek vec precizno definisao problem nema potrebe da mu solimo pamet kako mu je ideja glupa...


ne znam šta ima da kuliram.. nisam nikog vređao ili ne-daj-bože napadao..

čovek je pitao i pokrenuo diskusiju, ja mu rekao da se to tako ne radi (i još mu naveo primere gde svako može to da proveri -- microsoft alati koji dolaze uz windows), a on se odmah našao uvređen..

nego, možda i jesi u pravu.. možda sam mogao i da oćutim.. možda sledeći put i hoću..


a btw: odgovora još nema, jer na tako postavljeno pitanje ni ne postoji tačan odgovor!
[ morlic @ 18.12.2004. 13:52 ] @
Cekajte bre!

Sta bi sa mojim skromnim predlogom? Jel to neko probao ili sam izgubio 5min bespotrebno :) ?
[ Srki_82 @ 18.12.2004. 14:18 ] @
@morlic
Tvoja funkicja radi :) Samo izgleda bas i nije ono sto je FireProxy trazio cim hoce brze, hoce bolje, hoce jos :P Salim se :)

@FireProxy
Ako se desi ovako nesto. Program se pokrene 2. aprila u 00:00:00 i radi do 31. maja do 23:59:59 sta program treba da ispise?
Radim vec 58 dan, 23 sata, 59 minuta i 59 sekundi.
ili
Radim vec 1 mesec, 28 dana, 23 sata, 59 minuta i 59 sekundi.
ili
Radim vec 1 mesec, 27 dana, 23 sata, 59 minuta i 59 sekundi?
[ morlic @ 18.12.2004. 18:54 ] @
Mislim da je pod 2 ?

Kada je vreme u pitanju sto su duzi intervali merenja preciznost se prirodno smanjuje. Resenje bi bilo da se ide kroz kalendar, dan po dan i da se sumira broj dana. Na kraju se obradi i ostatak. Na ovaj nacin bi se dobio veoma precizan broj, samo sto mislim da tako niko ne radi zbog brzine racuna. Zato se koriste funkcije koje racunaju uzimajuci u obzir i gresku itd. Jednostavno, interval duzi od nekih mesec dana nije zgodan za preciznost. Tada se kaze "radio mesec dana", pa radio godinu i dva meseca", pa radio "dvadeset godina"...Koga na intervalima duzim od nekoliko dana zabole koliko jos sati? Osim ako nije program za parking servis :) Zbog svega toga ne bi trebalo niko da gubi zivce i da se raspravlja, pozivam sve na cisto tehnicku raspravu bez emocija.
[ _v!rus_ @ 28.02.2005. 17:42 ] @
Znam da je malo zakasnelo :), ali bio sam inspirisan jednim novijim postom da odgovorim ;-). Skromno mislim da je ovo najjednostavnije & foolproof resenje u temi ;-)

Code:

procedure TForm1.Button1Click(Sender: TObject);
var
  D, M, G, Sat, Min, Sek, MSek: Word;
  Dat: TDateTime;
begin
  Dat := EncodeDate(2005, 2, 28) + EncodeTime(12, 0, 0, 0);
  //12:00 28.2.2005

  DecodeDateTime(Now - Dat, G, M, D, Sat, Min, Sek, MSek);
  Dec(G, 1899);
  Dec(M, 12);
  Dec(D, 30);
  ShowMessage
  (
    IntToStr(G) + ' godina ' +
    IntToStr(M) + ' meseci ' +
    IntToStr(D) + ' dana ' +
    IntToStr(Sat) + ' sati ' +
    IntToStr(Min) + ' minuta ' +
    IntToStr(Sek) + ' sek. ' +
    IntToStr(MSek) + ' msek.'
  );


Radi za sve slucajeve sem za Dat > Now.