Avatar billede vallemanden Nybegynder
07. juni 2012 - 17:21 Der er 15 kommentarer og
1 løsning

tids beregning

Hej

Jeg skal lave
tidsum:=strtodatetime(sum2)-strtodatetime(sum3);

men mit problem er at sum2 og sum 3 kan være over 24:00:00, og så for jeg selvsagt fejl, nogen der har en løsning på det
Avatar billede vallemanden Nybegynder
07. juni 2012 - 17:23 #1
det skulle selvfølgelig have været

tidsum:=strtotime(sum2)-strtotime(sum3);
Avatar billede spil2vind Nybegynder
07. juni 2012 - 17:39 #2
Jeg vil da mene at dit første indlæg giver dig et resultat du kan bruge til at regne videre, men du siger ikke noget om hvad det er du skal bruge forskellen til?
07. juni 2012 - 17:45 #3
HEJ,

(Ved ikke om det hjælper - men prøver:)

Har du 2 tal ( eks 11 og 13 ) men sum må max være 20.

Nu er 11 + 13 = 24 (altså overskrider MAX værdi), da må tallenes sum justeres ned:

IF sum > MAX then
    Result := Sum - MAX
else
    result := sum;

som i dette tilælde vil give
    MENTE = 1
    og sum (result) = 4.

Og så tænkte jeg om du kunne justere din sum2 og Sum3 til et gyldigt tidsrum mellem 00:00:00 og 24:00:00 ved at anvende ovennænte metode.

(Jeg ville mene at en sum 0ver 24:00:00 egentlig hører til næste døgn og derfor burde det væl være som flg. eksempel:

Dag := 0;
Time := 25:03:14 (* ved konvertering kommer mente = 1 *)
---> Dag := 1; (* 0 + mente = 1 *)
---> Time := 01:03:14.

hvor du så må håndtere at DAG = 1 på en passende måde.

Og på samme måde ved differens.

KRistian
Avatar billede hugopedersen Nybegynder
07. juni 2012 - 18:22 #4
I mit lønprogram tæller jeg antal timer mellem 2 tider ved

TimeStart := Query.FieldByName('fldstart').AsFloat;
TimeStop := Query.FieldByName('fldstop').AsFloat;
if TimeStop < TimeStart then
  TimeStop := TimeStop + 1;
HourCount := (TimeStop - TimeStart) * 24;
Query.FieldByName('fldhourcount').AsFloat := HourCount;

det har fungeret ganske udmærket også selv om det er hen over midnat.
Avatar billede kroning Nybegynder
07. juni 2012 - 21:05 #5
Hvad med at omregne til sekunder, f.eks.:

--------
function GetTissumInSec(Sum1,Sum2 : string) : double;

function GetSumSec(Sum : string) : double;
var
    i : integer;
  SL : TStringList;
begin
    result:=0;
    SL:=TStringList.Create;
  ExtractStrings([':'],[],PAnsiChar(Sum),SL);
    for i:=0 to SL.Count-1 do
      result:=result+StrToIntDef(SL[i],0)*power(60,2-i);
end;

begin
    result:=GetSumSec(Sum2)-GetSumSec(Sum1);
end;
---------


eks.:
procedure TForm1.Button1Click(Sender: TObject);
var
    sum1,sum2 : string;
  tidsum : double;
begin
    sum1:='23:10:15';
  sum2:='24:10:14';
    tidsum:=GetTissumInSec(sum1,sum2);

  button1.Caption:=floattostr(tidsum);
end;
Avatar billede kroning Nybegynder
07. juni 2012 - 21:16 #6
Hæ, der er vist en stavefejl i funktions navnet :-)

Nå men husk at tilføje StrUtils og Math til uses
Avatar billede vallemanden Nybegynder
07. juni 2012 - 23:59 #7
kroning, det kan godt bruges, men jeg skal have vist resultatet som
tt:mm:ss det er det der er min problem
f.eks.

108:34:48
Avatar billede vallemanden Nybegynder
08. juni 2012 - 00:19 #8
kroning læg et svar :)

function SecToTime(Sec: integer): string;
var
    H, M, S: string;
    ZH, ZM, ZS: integer;
begin
    ZH := Sec div 3600;
    ZM := Sec div 60 - ZH * 60;
    ZS := Sec - (ZH * 3600 + ZM * 60) ;
    H := IntToStr(ZH) ;
    if Length(H) = 1 then H:='0'+H;
    M := stringreplace(IntToStr(ZM),'-','',[rfReplaceAll]) ;
    if Length(M) = 1 then M:='0'+M;
    S := stringreplace(IntToStr(ZS),'-','',[rfReplaceAll]) ;
    if Length(S) = 1 then S:='0'+S;
    Result := H + ':' + M + ':' + S;
end;
Avatar billede martinlind Nybegynder
08. juni 2012 - 01:57 #9
til en anden gang kan jeg anbefale dateutils unit'en, fra de nyere delphi ver., der er en del datetime func.
Avatar billede kroning Nybegynder
08. juni 2012 - 07:18 #10
Svar
Avatar billede kroning Nybegynder
08. juni 2012 - 07:19 #11
Svar
Avatar billede kroning Nybegynder
08. juni 2012 - 23:11 #12
Her er en lidt kortere udgave af din SecToTime function


function SecToTime(Sec: integer): string;
begin
    Sec:=Abs(Sec);
  Result:=Format('%.*d', [2, Sec div 3600]);
  Result:=Result+':'+Format('%.*d', [2, (Sec mod 3600) div 60]);
    Result:=Result+':'+Format('%.*d', [2, Sec mod 60]);
end;
Avatar billede martinlind Nybegynder
08. juni 2012 - 23:30 #13
og i dateutils uniten er der en func til at retunere tiden mellem to dato'er :-)
Avatar billede kroning Nybegynder
08. juni 2012 - 23:40 #14
martinlind: men de kan jo ikke bruges i dette tilfælde da f.eks. tiden 36:18:45 ikke er et godkendt format.
Avatar billede martinlind Nybegynder
09. juni 2012 - 15:37 #15
hvis man vælger at køre med en "rigtig" datetime, så vil man jo bare få talt dagen en op, delphi kan godt regne med dato'er :-)

Der er skam de func der skal bruges, f.eks. incTim() og IncMin() osv.
Avatar billede vallemanden Nybegynder
09. juni 2012 - 17:59 #16
Martinlind, jeg skal ikke bruge dage men timer minutter sekunder
og så skal der jo alligevel omregnes fra dage til timer


mange tak kroning
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester