Sumowanie czasu w delphi bez przekrecania

0

Witam,
w jaki sposob najlepiej przechowywac czas, aby mozna bylo go latwo sumowac?

W tej chwili deklaruje zwykla zmienna TTime i dodaje do niej lub odejmuje czas - jednak wartosci sie przekrecaja gdy uplynie 24:00,
czyli 12:00 + 15:00 = 3:00

a ja chcialbym uzyskac sume pelna czyli 27:00...

prosze o pomoc

2

Operować na sekundach i użyć na przykład takiej funkcji do wyświetlenia jako tekst:

function Secs2Time(Sec : Integer) : string;
var
  ZH, ZM, ZS : Integer;
begin
  if Sec > 0 then
  begin
    ZH := Sec div 3600;
    ZM := Sec div 60 - ZH * 60;
    ZS := Sec - (ZH * 3600 + ZM * 60);
    Result := Format('%0.2d:%0.2d:%0.2d', [ZH, ZM, ZS]);
  end
  else
  begin
    Result := Format('%0.2d:%0.2d:%0.2d', [0, 0, 0]);
  end;
end;

Tak ja bym przynajmniej kombinował. Bo jak wiadomo w module DateUtils są też różne funkcje konwertujące, w tym SecondOf. Oczywiście powyższy kod można sobie zmodyfikować, na przykład inaczej formatując zwracany string.

0

Faktycznie tez zastanawialem sie nad sekundami, ale to takie reczne podejscie, spodziewalem sie ze delphi ma cos 'extra' do tego,
pozostaje mi zrobic tak jak olesio zaproponowal (zaznaczcie odpowiedz), pozdro

2
program ideone;
uses SysUtils;

var Diff:TDateTime;
var Str:String;
begin
  Diff:=7.724838;
  Str:=Format('%d dni %s',[Trunc(Diff),FormatDateTime('hh:nn:ss',Diff)]);
  WriteLn(Str);
  Str:=Format('%d godzin %s',[Trunc(Diff*24),FormatDateTime('nn:ss',Diff)]);
  WriteLn(Str);
end.

http://ideone.com/wO2umV

0

Post MarkaR22 to przemilcze, bo widac przerwa od delphi nie za dobrze wyszla, a Dragon podal kod, ktory nie bardzo widze co obrazuje? Ze datetime to double czy co?

12:40 + 13:25 powinno wyjsc 26:05, dzieki pozdrawiam

1

Jeśli suma ma wyrażać się w liczbach > 24h to musisz to przekonwertować na TDateTime albo operować tylko na godzinach (HoursOf).

Wersja jak powyżej tylko z zastosowaniem nowych funkcji (nie wiem czy działa - z fpc nie):

program ideone;
uses sysutils;
var t1, t2: TTime;
  sum: TDateTime;
  Str: String;
begin
  t1 := EncodeTime(12,0,0,0);
  t2 := EncodeTime(15,0,0,0);
    
  sum:=t1 + t2;
  Str:=Format('%d dni %s',[DaysOf(sum),FormatDateTime('hh:nn:ss',sum)]);
  WriteLn(Str);
  Str:=Format('%d godzin %s',[HoursOf(sum),FormatDateTime('nn:ss',sum)]);
  WriteLn(Str);
end.
1

HourOf nie działa, ale link który ja dałem poprzednio działa (3 link jaki dałem).
http://ideone.com/VlmaBi
Jak pisałem problemem pytającego jest niechęć do wertowania dokumentacji.

program ideone;
uses SysUtils, DateUtils;

var sum:TDateTime;
var Str:String;
var aString:String;
var bString:String;
begin
  readln(aString);
  readln(bString);
  sum := StrToDateTime(aString) + StrToDateTime(bString);
  Str:=Format('%d:%.2d',[HoursBetween(sum, 0),MinuteOf(sum)]);
  WriteLn(Str);
  Str:=Format('%d:%s',[HourOf(sum),FormatDateTime('nn',sum)]);
  WriteLn(Str);
end.
0

DObra, wracam po przerwie, aby podziekowac wszystkim za porady.
Po analizie problemu, doszedlem do wniosku ze moim bledem bylo stosowanie TTime zamiast TDateTime.
Jak wyswietlac wynik koncowy to juz funkcji jest kilka (dateutils).
pozdrawiam

0
jangcy2 napisał(a):

... ze moim bledem bylo stosowanie TTime zamiast TDateTime.

Chrzani waść, przecież i to i tamto to najzwyklejszy double.

1

Dokładnie. Cytaty na szybko ze źródeł VCL od Delphi 7, ale i późnej jak i wcześniej pewnie jest/było podobnie.

system.pas napisał(a)

TDateTime = type Double;

controls.pas napisał(a)

TDate = type TDateTime;
TTime = type TDateTime;

I wszystko w temacie.

0

Ok cofam co napisałem odnosnie TTime/TDatetime - wystarczy odpowiednio sformatowac wynik koncowy, bo inaczej wynik jest 'przekrecony'

0
jangcy2 napisał(a):

.... bo inaczej wynik jest 'przekrecony'

Znowu waść chrzani, nie przekręcony tylko niepełny brakuje wypisania ilości pełnych dni.

0

AFAIR TDateTime rozni sie tym od TTime ze ten drugi jest automatycznie obcinany do czasu, ale czy to jest na etapie obliczen czy wyswietlania - nie pamietam. Ale to raczej latwo sprawdzic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1