Seite 1 von 1

Aus einem Sekundenwert hh:mm.ss berechnen

Verfasst: 02.09.2006 21:48
von Frogger

Code: Alles auswählen

;PB 400
Procedure.s SecToTime(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
  Protected stunden.l, minuten.l, sekunden.l
  Protected hh.s, mm.s, ss.s
  minuten = sec/60
  sekunden = sec-(minuten*60)
  stunden = minuten/60
  minuten = minuten-(stunden*60)
  hh = Str(stunden)
  mm = Str(minuten)
  ss = Str(sekunden)
  If stunden  < 10 : hh = "0"+hh : EndIf
  If minuten  < 10 : mm = "0"+mm : EndIf
  If sekunden < 10 : ss = "0"+ss : EndIf
  ProcedureReturn hh+":"+mm+"."+ss
EndProcedure 


Debug SecToTime(65)
Debug SecToTime(3600) ;1 Stunde
Debug SecToTime(7230) ;2 Stunden 30 Sekunden
Diese Procedur hab ich für einige meiner Projekte gebraucht.
Wer zu faul ist sich selber eine zu schreiben kann diese benutzen :wink:

Verfasst: 03.09.2006 00:57
von PMV
Du weist schon, das PB dafür eine eigene Funktion hat?

Code: Alles auswählen

Debug FormatDate("%hh:%ii.%ss", 65)
Debug FormatDate("%hh:%ii.%ss", 3600) ;1 Stunde
Debug FormatDate("%hh:%ii.%ss", 7230) ;2 Stunden 30 Sekunden
Aber da deine nicht so allgemein ist, vielleicht ist diese ein paar
Millisekunden schneller :D ... aber is jetzt zu spät als das ich noch nen
Geschwindigkeitstest machen würde ^_^

Mir fällt grad ein, vielleicht gibs die in der 3.3 noch nicht <)

MFG PMV

Verfasst: 03.09.2006 03:11
von Frogger
Tja und das ist der kleine aber feine Unterschied :wink:

Code: Alles auswählen

Debug SecToTime(1414717430)
Debug FormatDate("%hh:%ii.%ss", 1414717230)
Hier zeigt mir meine Prozedur das richtige Ergebnis an (392:58.37)
und FormatDate kommt da einfach nicht mit.
Was davon schneller ist muss ich noch prüfen.

Das Ergebniss kannst du mit dem Taschenrechner nachprüfen wenn du willst.

Verfasst: 03.09.2006 03:25
von edel
Formatdate ist sehr wohl richtig , die Maske ist nur unvollstaendig.

Verfasst: 03.09.2006 03:47
von Frogger
Du meinst wenn ich %hhh eingebe dann wird das ergebniss richtig?
So funktioniert das auch nicht. (Tage und Monate will ich nicht anzeigen lassen. Nur h, m und s)


Hier schonmal der Speedtest.
Hab die Prozedur etwas Verbessert und handlicher gemacht.

Code: Alles auswählen

Procedure.s SecToTime(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
  Protected stunden.l  = 0, minuten.l  = 0, sekunden.l = 0
  Protected hh.s, mm.s, ss.s, timestring.s
  minuten = sec/60
  sekunden = sec-(minuten*60) 
  stunden = minuten/60
  minuten = minuten-(stunden*60)
  If stunden < 10
    hh.s = "0"+Str(stunden)
  Else
    hh.s = Str(stunden) 
  EndIf
  If minuten < 10
    mm.s = "0"+Str(minuten)
  Else
    mm.s = Str(minuten) 
  EndIf
  If sekunden < 10
    ss.s = "0"+Str(sekunden)
  Else
    ss.s = Str(sekunden) 
  EndIf 
  timestring.s = hh+":"+mm+"."+ss
  ProcedureReturn timestring.s
EndProcedure


Procedure.s SecToTime2(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss
  Protected stunden.l, minuten.l, sekunden.l
  Protected hh.s, mm.s, ss.s
  minuten = sec/60
  sekunden = sec-(minuten*60) 
  stunden = minuten/60
  minuten = minuten-(stunden*60)
  hh = Str(stunden)
  mm = Str(minuten)
  ss = Str(sekunden) 
  If stunden  < 10 : hh = "0"+hh : EndIf
  If minuten  < 10 : mm = "0"+mm : EndIf
  If sekunden < 10 : ss = "0"+ss : EndIf 
  ProcedureReturn hh+":"+mm+"."+ss
EndProcedure




#XYZ = 500000

start.l = GetTickCount_()
For i=1 To #XYZ
  SecToTime(1234)
Next
stop1.l = GetTickCount_()-start

start.l = GetTickCount_()
For i=1 To #XYZ
  SecToTime2(1234)
Next
stop2.l = GetTickCount_()-start

start.l = GetTickCount_()
For i=1 To #XYZ
  FormatDate("%hh:%ii.%ss", 1234)
Next
stop3.l = GetTickCount_()-start

MessageRequester("Speedtest SecToTime...SecToTime2...FormatDate", "Durchläufe: "+Str(#XYZ)+Chr(13)+Chr(10)+"Speed SecToTime: "+Str(stop1)+Chr(13)+Chr(10)+"Speed SecToTime2: "+Str(stop2)+Chr(13)+Chr(10)+"Speed FormatDate: "+Str(stop3))
Bei mir kommt das hier raus:
SecToTime = 1390
SecToTime2 = 1156
FormatDate = 994

Sooo viel schneller ist FormatDate nicht.

Verfasst: 03.09.2006 04:52
von PMV
hm, ja ... in dem fall ist FormatDate() schlecht.
Ich hab die Prozedur noch mal nen bischen verändert, so wies scheint ist diese auch was schneller als die anderen. An FormateDate() komms aber natürlich nicht ran.

Code: Alles auswählen

Procedure.s SecToTime(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss 
  Protected stunden.l  = 0, minuten.l  = 0, sekunden.l = 0 
  Protected hh.s, mm.s, ss.s, timestring.s 
  minuten = sec/60 
  sekunden = sec-(minuten*60) 
  stunden = minuten/60 
  minuten = minuten-(stunden*60) 
  If stunden < 10 
    hh.s = "0"+Str(stunden) 
  Else 
    hh.s = Str(stunden) 
  EndIf 
  If minuten < 10 
    mm.s = "0"+Str(minuten) 
  Else 
    mm.s = Str(minuten) 
  EndIf 
  If sekunden < 10 
    ss.s = "0"+Str(sekunden) 
  Else 
    ss.s = Str(sekunden) 
  EndIf 
  timestring.s = hh+":"+mm+"."+ss 
  ProcedureReturn timestring.s 
EndProcedure 


Procedure.s SecToTime2(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss 
  Protected stunden.l, minuten.l, sekunden.l 
  Protected hh.s, mm.s, ss.s 
  minuten = sec/60 
  sekunden = sec-(minuten*60) 
  stunden = minuten/60 
  minuten = minuten-(stunden*60) 
  hh = Str(stunden) 
  mm = Str(minuten) 
  ss = Str(sekunden) 
  If stunden  < 10 : hh = "0"+hh : EndIf 
  If minuten  < 10 : mm = "0"+mm : EndIf 
  If sekunden < 10 : ss = "0"+ss : EndIf 
  ProcedureReturn hh+":"+mm+"."+ss 
EndProcedure 

Procedure.s SecToTime3(sec.l) ;Rückgabewert ist ein string in dieser Form hh:mm.ss 
  Protected h.l, m.l, s.l, r.s 
  s = sec % 60 
  m = sec % 3600
  m / 60
  h = sec / 3600 
  r = Str(s) 
  If s < 10 : r = "0" + r : EndIf 
  r = Str(m) + "." + r 
  If m < 10 : r = "0" + r : EndIf 
  r = Str(h) + ":" + r 
  If h < 10 : r = "0" + r : EndIf 
  ProcedureReturn r 
EndProcedure 


#XYZ = 500000 

start.l = GetTickCount_() 
For i=1 To #XYZ 
  SecToTime(1234) 
Next 
stop1.l = GetTickCount_()-start 

start.l = GetTickCount_() 
For i=1 To #XYZ 
  SecToTime2(1234) 
Next 
stop2.l = GetTickCount_()-start 

start.l = GetTickCount_() 
For i=1 To #XYZ 
  SecToTime3(1234) 
Next 
stop3.l = GetTickCount_()-start 

start.l = GetTickCount_() 
For i=1 To #XYZ 
  FormatDate("%hh:%ii.%ss", 1234) 
Next 
stop4.l = GetTickCount_()-start 

MessageRequester("Speedtest SecToTime...SecToTime2...SecToTime3...FormatDate", "Durchläufe: "+Str(#XYZ)+Chr(13)+Chr(10)+"Speed SecToTime: "+Str(stop1)+Chr(13)+Chr(10)+"Speed SecToTime2: "+Str(stop2)+Chr(13)+Chr(10)+"Speed SecToTime3: "+Str(stop3)+Chr(13)+Chr(10)+"Speed FormatDate: "+Str(stop4))
Ergebnis:
1.: 9170
2.: 8268
3.: 7887
FormateDate(): 5272

MFG PMV

Verfasst: 03.09.2006 13:31
von Frogger
Bei mir ist die sogar 30% schneller als Formatdate.

500000 Durchläufe
SecToTime = 859
SecToTime2 = 719
SecToTime3 = 453
Formatdate = 656

5000000 Durchläufe
SecToTime = 8547
SecToTime2 = 7110
SecToTime3 = 4578
Formatdate = 6562

Aber andererseits wer fragt schon 500000 mal in der Sekunde die zeit ab :freak:

Verfasst: 04.09.2006 19:28
von KingKong
Frogger hat geschrieben:Tja und das ist der kleine aber feine Unterschied :wink:

Code: Alles auswählen

Debug SecToTime(1414717430)
Debug FormatDate("%hh:%ii.%ss", 1414717230)
Hier zeigt mir meine Prozedur das richtige Ergebnis an (392:58.37)
und FormatDate kommt da einfach nicht mit.
Was davon schneller ist muss ich noch prüfen.

Das Ergebniss kannst du mit dem Taschenrechner nachprüfen wenn du willst.
Wenn man 2 unterschiedliche Parameter benutzt, kann ja auch nie das gleiche Ergebnis kommen !?!? :?
FormatDate("%hh:%ii.%ss", 1414717230) mit diesen Parametern macht folgendes:
Der Überlauf (alles was größer x mal 24h Stunden ist) wird abgeschnitten.
Der Rest 01:00.30 wird nun angezeigt.
Will man größere Stundenzahl angezeigt bekommen, muß man tatsächlich eine eigene Routine schreiben.
Das Ergebnis "392:58.37" kann aber auch nicht stimmen.

Verfasst: 05.09.2006 21:46
von Frogger
Das Ergebnis "392:58.37" kann aber auch nicht stimmen.
Ja das stimmt. Ich hab das nur falsch eingetippt.
Aber die Prozedur liefert das richtige Ergebniss.