timecalc() »»» Zeitangaben beliebig umrechnen & ausgeben

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

timecalc() »»» Zeitangaben beliebig umrechnen & ausgeben

Beitrag von AND51 »

  • (reserviert für den aktuellsten Code aus Gründen der Übersichtlichkeit)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hallo!

Ich möchte hier meine Prozedur vorstellen, die ich vorhin erarbeitet habe. Dabei habe ich mich von kinglestat (englisches Forum) inspirieren lassen.

Diese Prozedur soll relative Zeitanhaben mit Millisekunden (!) in beliebige Einheiten umrechnen.
Ich habe mich dabei an FormatDate() orientiert, man kann also über eine Maske bestimmen welche Werte berücksichtigt werden sollen.

Außerdem ist die Prozedur "intelligent", d. h. wenn ich 12345 habe, wandelt sie maximal in die größte angegebene Einheut um:
%sss %msms => 12s 345ms (wenn ich 2 Einheiten haben möchte)
%msms => 12345ms (wenn ich nur die Millisekunden haben will)

Je weniger Einheiten benutzt werden, desto schneller ist die Prozedur. Es stehen alle Einheiten wie bei FormatDate() und %ms zur Verfügung:
  • %yy Jahre
    Monate gibt es nicht, denn ein Monat kann 28-31 Tage haben
  • %dd Tage
  • %hh Stunden
  • %ii Minuten
  • %ss Sekunden
  • %ms Millisekunden
Viel Spaß damit! Solltet ihr bessere/schnellere/optimiertere Versionen posten kann ich sie in den 1. Posting reintun, damit Neulinge sofort den besten Code an erster Stelle vorfinden! <)

Code: Alles auswählen

Procedure.s timecalc(mask$, time.q) ; %yy %dd %hh %ii %ss %ms
	If FindString(mask$, "%yy", 1)
		Protected yy.l=time/31536000000
		time-yy*31536000000
		mask$=ReplaceString(mask$, "%yy", Str(yy))
	EndIf
; 	Month cannot be calculated, because a month can have 28-31 days
	If FindString(mask$, "%dd", 1)
		Protected dd.l=time/86400000
		time-dd*86400000
		mask$=ReplaceString(mask$, "%dd", Str(dd))
	EndIf
	If FindString(mask$, "%hh", 1)
		Protected hh.q=time/3600000
		time-hh*3600000
		mask$=ReplaceString(mask$, "%hh", Str(hh))
	EndIf
	If FindString(mask$, "%ii", 1)
		Protected ii.q=time/60000
		time-ii*60000
		mask$=ReplaceString(mask$, "%ii", Str(ii))
	EndIf
	If FindString(mask$, "%ss", 1)
		Protected ss.q=time/1000
		time-ss*1000
		mask$=ReplaceString(mask$, "%ss", Str(ss))
	EndIf
	If FindString(mask$, "%ms", 1)
		mask$=ReplaceString(mask$, "%ms", Str(time))
	EndIf
	ProcedureReturn mask$
EndProcedure

Debug timecalc("Kurz: %yyy %ddd %hhh %iim %sss %msms", 34041598234)
Debug timecalc("Normal: %yy years %dd days %hh hours %ii minutes %ss seconds %ms milliseconds", 34041598234)
Debug timecalc("Abgekürzt: %yy yrs %dd days %hh hrs %ii mins %ss sec %ms msec", 34041598234)
Debug timecalc("Mathematisch: %yyy %ddd %hh:%ii'%ss''%ms'''", 34041598234)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten