Seite 1 von 2

Rechnung/Formel von Arbeitszeiten

Verfasst: 17.03.2009 16:00
von Radiate
Hallo Leute,

bin zwar länger nicht mehr da gewesen, habe aber nun ne Frage.
Programmiere gerade ein Tool das Arbeitszeiten berechnen soll.
Hierbei verwende ich folgendes Bild:

Beginn | Ende

Wobei Beginn 1330 für 13:30 steht und Ende 2200 für 22:00.
Nun weiß ich nicht wie ich 1330 bis zu 2200 rechnen lassen kann?

Hab schon folgendes versucht:

a = 1330
b = 2200
c = a+b (Ist aber falsch, ergibt nämlich 3530 also demnach hätte man 35,30 geabreitet)

Weiteres funktioniert ebenfalls nicht:

a = 1330
b = 2200
c = b-a (Ergibt wieder falsche Arbeitszeit von diesesmal 870 also 8,70)


Hat da jemand nen Gedankensblitz oder sowas?


Danke schonmal

Verfasst: 17.03.2009 16:08
von KeyKon
Lol soll das ein Witz sein? Wenn du mit Zeiten im Deziamlsystem rechnest musst du die Zeit Vorher auch ins Dezimalsystem Umrechnen...

a -> 13:30 -> 1350
b -> 22:00 -> 2200

c = b-a -> 2200-1350 = 850

c -> 850 -> 8:30 Stimmt

du musst die Minuten durch 60 Teilen und mal 100 nehmen und andersrum um das korrekt umzurechnen...

Ich würde ohnehin mit Timestamps in Sekunden rechnen weil man dann die Date-Funktionen einfach benutzen kann...

PS: Das ganze hätte ich mal ganz dezent ins Anfängerforum gepostet^^ (Is würde sagen Mathematik 2. oder 3. Klasse xD)

Verfasst: 17.03.2009 16:08
von Kaeru Gaman
du musst natürlich die Minuten gesondert betrachten.

am einfachsten wäre es, wenn du die Stundenbruchteile gleich in Hundertsteln notierst,
13:30h wäre also 1350, 19:45h wäre 1975, 16:15h wäre 1625, usw.

die mögliche Auflösung dabei beträgt drei minuten: alle drei minuten wächst der Hundertstel-Zähler um 05

Verfasst: 17.03.2009 17:33
von Radiate
ich weiß das das Grundschule ist aber ich bin da schon länger raus und suche nur noch ne Formel, doch irgendwie funktioniert das nicht.

@KeyKon:
Das funktioniert so nicht da ich Minutengenau rechnen möchte also keine Sekundenangaben brauche.

Hm, ich würde das auch gerne in einer Industriezeitrechnung also Dezimal rechnen aber es funktioniert nicht.
Hier ist mein Code, vielleicht fällt euch noch was dazu ein:

Code: Alles auswählen

a$ = GetGadgetText(#Jan09_1Start)
b$ = GetGadgetText(#Jan09_1Finish)
a = Val(a$)
b = Val(b$)
c = b/60*100-a/60*100
d$ = Str(c)
SetGadgetText(#PresenceFieldOne,d$)

Verfasst: 17.03.2009 17:38
von KeyKon
Junge! Du darfst natürlich nur die Minuten /60*100 nehmen! Und danach musst du das wieder rückgängig machen...

Im übrigen machts ja wohl keinen Unterschied ob du Minuten Sekunden oder Nanosekundengenau rechnest wenn die beiden Werte mit denen du rechnest eh Minutengenau sind...

EDIT:

Was spricht dagegn es so zu machen?

Code: Alles auswählen

Procedure StrToTime(str$)
  ProcedureReturn ParseDate("%hh%ii",RSet(str$,4,"0"))
EndProcedure

Procedure.s TimeToStr(time)
  ProcedureReturn Str(Val(FormatDate("%hh%ii",time)))
EndProcedure

a$ = "1330"
b$ = "2200"

Debug TimeToStr(StrToTime(b$)-StrToTime(a$))

Verfasst: 17.03.2009 17:47
von Radiate
@KeyKon:

Ersten, bleib mal höfflich und nenn mich nicht Junge!
Zweitens, ich will NICHT in Sekunden rechnen, also auch nicht in Sekunden, Milisekunden oder Nanosekunden.

Würde das gern so machen wie Kaeru Gaman, also 1330 - 2200 -> 8.5 usw.

Verfasst: 17.03.2009 17:52
von KeyKon
Dann rechnen Sie doch auch so, auch wenn der Aufwand bei gleichem Ergebnis größer ist, oben hab ich noch einen Code so wie ich ihn nutzen würde Editiert, nur falls Ihnen das noch nicht aufgefallen hat.
Entschuldigen Sie bitte das ich Sie vorhin etwas unwirsch angefahren habe, aber das schien mir aufgrund der Tatsache das Kaeru bereits schrieb das man die Minuten gesondert rechnen muss, und sie es dennoch nicht getan haben etwas angebracht als Signal des "aufweckens"...
Sry für den etwaigen ironischen Unterton...

Verfasst: 17.03.2009 19:50
von Kaeru Gaman
es geht auch ohne trennen und umrechnen, mit adaptiertem overflow-handling:

Code: Alles auswählen

a$ = "1330"
b$ = "2200"
a = Val(a$)
b = Val(b$)
c = b-a
If Val(Right(b$,2))-Val(Right(a$,2)) < 0
  c = c -40
EndIf
d$ = Str(c)
Debug d$

Verfasst: 17.03.2009 20:25
von HeX0R
Mach dir doch einfach ne Prozedur dafür:

Code: Alles auswählen

Procedure.d T2V(TimeString.s)
	Protected d.d = Val(Left(TimeString, 2)) + Val(Right(TimeString, 2)) / 60
	
	ProcedureReturn d
EndProcedure

Debug T2V("2200") - T2V("1330")
Debug T2V("1923") - T2V("1141")
oder gleich so:

Code: Alles auswählen

Procedure.d CalulateRealTime(TimeStringStart.s, TimeStringEnd.s)
	Protected Start.d = Val(Left(TimeStringStart, 2)) + Val(Right(TimeStringStart, 2)) / 60
	Protected _End.d  = Val(Left(TimeStringEnd, 2)) + Val(Right(TimeStringEnd, 2)) / 60
	
	ProcedureReturn (_End - Start)
EndProcedure

Debug CalulateRealTime("1330", "2200")
Debug CalulateRealTime("1141", "1923")

Verfasst: 18.03.2009 09:29
von Toshy
Ähem,...
Guten Morgen.

Also wie wäre es wenn ihr einfach die date()-Funktion nutzt. (KeyKon nutzt ja auch ne "date()-Funktion", was genau so richtig und einfach ist :-).Die finde ich an PB sehr toll, damit kann man sehr einfach rechnen. Diese rechnet eine Datum mit Uhrzeit in einen Sekundenwert um. Damit rechner ist dann ja superleicht. Gib die Startzeit mit einem "date()" an, die zweite mit einem neuen, dann addieren oder subtrahieren, ferig. Wenn gewünscht wandelt dir FormatDate() den Wert auch wieder in ne Uhrzeit um.

TIP: wenn es nur um ne Uhrzeit geht, nimm einfach einen festen Tag der nicht gerade in einem Schaltjahr Ende Februar liegt ;-)

[edit]

Code: Alles auswählen

Debug "Arbeitszeit von 13.30 Uhr bis 22 Uhr in Minuten(Ohne Rundungsfunkion):"
Debug (Date(2001,10,10,22,00,0) - Date(2001,10,10,13,30,0)) / 60

Debug  FormatDate("%hh Stunden und %ii Minuten", Date(2001,10,10,22,00,0) - Date(2001,10,10,13,30,0)  )