Avatar billede vallemanden Nybegynder
15. april 2005 - 17:17 Der er 30 kommentarer og
1 løsning

lægge timer minutter og sekunder sammen

Hej

Er der nogen der ligger inde med eller kan lave kode til at ligge timer minutter og sekunder sammen?

f.eks
04:32:10 og
23:32:15 bliver til
28:04:25

V
Avatar billede arne_v Ekspert
15. april 2005 - 17:38 #1
Det kan muligvis laves smartere men det her virker:

function timeadd(t1, t2 : string) : string;

var
  h1,m1,s1 : integer;
  h2,m2,s2 : integer;
  h3,m3,s3 : integer;

begin
  h1 := StrToInt(Copy(t1, 1, 2));
  m1 := StrToInt(Copy(t1, 4, 2));
  s1 := StrToInt(Copy(t1, 7, 2));
  h2 := StrToInt(Copy(t2, 1, 2));
  m2 := StrToInt(Copy(t2, 4, 2));
  s2 := StrToInt(Copy(t2, 7, 2));
  s3 := s1 + s2;
  m3 := m1 + m2;
  h3 := h1 + h2;
  if s3 >= 60 then begin
    s3 := s3 - 60;
    m3 := m3 + 1;
  end;
  if m3 >= 60 then begin
    m3 := m3 - 60;
    h3 := h3 + 1;
  end;
  result := '';
  if h3 < 10 then
    result := result + '0' + IntToStr(h3)
  else
    result := result + IntToStr(h3);
  result := result + ':';
  if m3 < 10 then
    result := result + '0' + IntToStr(m3)
  else
    result := result + IntToStr(m3);
  result := result + ':';
  if s3 < 10 then
    result := result + '0' + IntToStr(s3)
  else
    result := result + IntToStr(s3);
end;

procedure TForm1.Button1Click(Sender: TObject);

begin

  Edit3.Text := timeadd(Edit1.Text, Edit2.Text);
end;
Avatar billede vallemanden Nybegynder
15. april 2005 - 17:46 #2
jeg glemte nok lige at sige det ikke kun er 2 time stringe der skal ligges sammen men det kan jeg jo nemt nok programmere mig ud af når jeg nu har do.

arne læg et svar, venter lidt med at aceptere, hvis der skulle kommer mere
Avatar billede arne_v Ekspert
15. april 2005 - 18:01 #3
svar
Avatar billede arne_v Ekspert
15. april 2005 - 18:01 #4
Muligvis er der noget smart i Delphi til det - jeg har bare kodet det hele selv.
Avatar billede kroning Nybegynder
15. april 2005 - 20:12 #5
Jeg har en ide, jeg laver lige et eks. senere i aften når jeg kommer hjem.
Avatar billede kroning Nybegynder
15. april 2005 - 23:07 #6
Den kræver at du bruger en Delphi version der har uniten DateUtils som skal tilføjes uses, jeg bruger Delphi 7 men jeg ved ikke hvor langt tilbage den findes:

function TimeAdd(Tstr : array of string) : string;
var
  i,Sec : integer;

function DecSec(count : integer) : string;
begin
  i:=(Sec div count);
  Result:=Format('%.2d',[i]);
  Dec(Sec,(i*Count));
end;

begin
  Sec:=0;
  for i:=0 to Length(Tstr)-1 do
    Sec:=Sec+SecondsBetween(0,StrToTime(Tstr[i]));
  Result:=DecSec(3600)+':'+DecSec(60)+':'+DecSec(1);
end;

Du kan ligge ligeså mange tider sammen som du ønsker, f.eks.:

/04:32:10 og
//23:32:15 og
//16:18:55 bliver til
//44:23:20

kaldes sådan:

Label1.Caption:=TimeAdd(['04:32:10','23:32:15','16:18:55']);
Avatar billede kroning Nybegynder
15. april 2005 - 23:18 #7
Lige en bem., hvis du han en ældre version af Delphi f.eks. version 4 så har du ikke DateUtils uniten og derfor ikke funktionen SecondsBetween, men den kan jeg så hurtig lave så.
Avatar billede kroning Nybegynder
15. april 2005 - 23:47 #8
ok, her er så lige en version der ikke kræver DateUtils uniten:

function TimeAdd(Tstr : array of string) : string;
var
  i,Sec : integer;

function DecSec(count : integer) : string;
begin
  i:=(Sec div count);
  Result:=Format('%.2d',[i]);
  Dec(Sec,(i*Count));
end;

begin
  Sec:=0;
  for i:=0 to Length(Tstr)-1 do
    Sec:=Sec+Round(StrToTime(Tstr[i])*86400);
  Result:=DecSec(3600)+':'+DecSec(60)+':'+DecSec(1);
end;
Avatar billede martinlind Nybegynder
16. april 2005 - 10:49 #9
hvis du har to TDateTime så er det da bare at lægge dem sammen

MyDate3 := MyDate1 + MyDate2;
Avatar billede vallemanden Nybegynder
16. april 2005 - 16:23 #10
jeh køre delphi 7 pro
Avatar billede vallemanden Nybegynder
16. april 2005 - 16:24 #11
martinlind

får jeg så ikke dage med?
Avatar billede kroning Nybegynder
17. april 2005 - 07:55 #12
>får jeg så ikke dage med?

Jo
Avatar billede vallemanden Nybegynder
17. april 2005 - 18:03 #13
>>får jeg så ikke dage med?

>Jo

Det er jo lige det jeg IKKE vil have :-)
Avatar billede kroning Nybegynder
17. april 2005 - 18:49 #14
Kan du ikke bruge den funktion jeg har lavet, der får du ikke dage men antal timer også selvom det er mere end 24, og derefter minutter og sekunder?
Avatar billede vallemanden Nybegynder
17. april 2005 - 20:05 #15
jo det tror jeg nok jeg kan men prøver før i morgen :-) men lig et svar
Avatar billede kroning Nybegynder
19. april 2005 - 10:09 #16
ok, svar
Avatar billede vallemanden Nybegynder
25. april 2005 - 14:43 #17
>>Kroning

Jeg for en fejl når timer når over 24...
jeg bruger dit første exp.
Avatar billede kroning Nybegynder
25. april 2005 - 14:49 #18
Hvis du bruger f.eks.
/04:32:10 og
//23:32:15 og
//16:18:55
med koden:
Label1.Caption:=TimeAdd(['04:32:10','23:32:15','16:18:55']);

får du så ikke resultatet: 44:23:20, det er jo langt over de 24?
Avatar billede vallemanden Nybegynder
25. april 2005 - 15:00 #19
Det har du ganske ret i men hvis et af talene er OVER 24:00:00 så dur tælleren ikke mere, og det vil den blive hvis du ligge bare et tal mere tal til
Avatar billede kroning Nybegynder
25. april 2005 - 18:13 #20
ok, jeg troede at de tider der skulle ligges sammen alle var gyldige tidspunkter dvs. fra 00:00:00 til max. 23:59:59 og derfor kunne jeg bruge funktionen StrToTime, men hvis tiderne der skal ligges sammen kan være over 23:59:59 så skal der en anden beregning til. Det vil jeg lige kikke på senere i aften.
Avatar billede kroning Nybegynder
25. april 2005 - 19:30 #21
Sådan, den virker dog ikke hvis du har tider der har et andet format end hh:mm:ss, dvs. at tiden 126:46:23 vil ikke virke, hvis du har sådan tider så sig til så laver jeg en ny løsning.


function TimeAdd(Tstr : array of string) : string;
var
  i,Sec : integer;

function DecSec(count : integer) : string;
begin
  i:=(Sec div count);
  Result:=Format('%.2d',[i]);
  Dec(Sec,(i*Count));
end;

function CovertToSec(TimeStr : string) : integer;
var
  i,SecAdd : integer;
begin
  i:=7;Result:=0;SecAdd:=1;
  while i>0 do
  begin
    Result:=Result+(StrToInt(Copy(TimeStr,i,2))*SecAdd);
    Dec(i,3);
    SecAdd:=SecAdd*60;
  end;
end;

begin
  Sec:=0;
  for i:=0 to Length(Tstr)-1 do
    Sec:=Sec+CovertToSec(Tstr[i]);
  Result:=DecSec(3600)+':'+DecSec(60)+':'+DecSec(1);
end;
Avatar billede vallemanden Nybegynder
25. april 2005 - 20:54 #22
Det er en sammen læggening af en masse timer:-)
Avatar billede vallemanden Nybegynder
25. april 2005 - 20:54 #23
hov..

så jeg ligger totalen sammen med et givet antal timer minutter sekunder
Avatar billede vallemanden Nybegynder
25. april 2005 - 20:55 #24
det kan meget vel kommer over 99:59:59
Avatar billede kroning Nybegynder
25. april 2005 - 20:56 #25
Hvad er det for en type timere?
Avatar billede vallemanden Nybegynder
25. april 2005 - 21:05 #26
det bliver gemt som string(varchar)

de enkelte tider kommer ikke over 8-10 timer men det gør totalen
Avatar billede vallemanden Nybegynder
25. april 2005 - 21:12 #27
QRLabel24.Caption:=TimeAdd([QRLabel24.Caption,TimerTable1.FieldByName('antalminutter').AsString]);
Avatar billede vallemanden Nybegynder
25. april 2005 - 21:18 #28
kan ikke få din sidste kode til at virke

jeg vil gerne give dig flere points når det er :-) synes du haar gjort et stort stykke arbejde
Avatar billede kroning Nybegynder
25. april 2005 - 21:25 #29
For lige at få det slået helt fast så har _alle_ dine timere formatet hh:mm:ss hvor hh kan være et hvilket som helst tal, mm er fra 00 til 59, og ss er fra 00 til 59. Er det korrekt?
Avatar billede vallemanden Nybegynder
25. april 2005 - 21:30 #30
Ja 1 time og 52 min og 17 sek vil se således ud

01:52:17
som en string
Avatar billede kroning Nybegynder
26. april 2005 - 20:07 #31
function TimeAdd(Tstr : array of string) : string;
var
  i,Sec : integer;

function DecSec(count : integer) : string;
begin
  i:=(Sec div count);
  Result:=Format('%.2d',[i]);
  Dec(Sec,(i*Count));
end;

function CovertToSec(TimeStr : string) : integer;
begin
  Result:=StrToInt(Copy(TimeStr,1,pos(':',TimeStr)-1))*3600;
  Result:=Result+StrToInt(Copy(TimeStr,pos(':',TimeStr)+1,2))*60;
  Result:=Result+StrToInt(Copy(TimeStr,pos(':',TimeStr)+4,2));
end;

begin
  Sec:=0;
  for i:=0 to Length(Tstr)-1 do
    Sec:=Sec+CovertToSec(Tstr[i]);
  Result:=DecSec(3600)+':'+DecSec(60)+':'+DecSec(1);
end;

----------------------

Jeg har testet med:
//04:32:10 og
//23:32:15 og
//16:18:55 og
//163:45:36 som giver resultatet
//  218:08:56 hvilket skulle være rigtig efter min hovedregning

  Label1.Caption:=TimeAdd(['04:32:10','23:32:15','26:18:55','163:45:36']);
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
Kategori
Kurser inden for grundlæggende programmering

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