Rechnung/Formel von Arbeitszeiten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Radiate
Beiträge: 114
Registriert: 10.02.2008 16:40
Kontaktdaten:

Rechnung/Formel von Arbeitszeiten

Beitrag 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
» PureBasic 4.30
» AMD Athlon II X2 240 | 2048 RAM | Win XP SP 3
» Projekt(e): Fusion (eingestellt), SAS (eingestellt), Moviez
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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)
Zuletzt geändert von KeyKon am 17.03.2009 16:09, insgesamt 1-mal geändert.
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Radiate
Beiträge: 114
Registriert: 10.02.2008 16:40
Kontaktdaten:

Beitrag 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$)
» PureBasic 4.30
» AMD Athlon II X2 240 | 2048 RAM | Win XP SP 3
» Projekt(e): Fusion (eingestellt), SAS (eingestellt), Moviez
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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$))
Zuletzt geändert von KeyKon am 17.03.2009 17:49, insgesamt 1-mal geändert.
(\/) (°,,,°) (\/)
Radiate
Beiträge: 114
Registriert: 10.02.2008 16:40
Kontaktdaten:

Beitrag 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.
» PureBasic 4.30
» AMD Athlon II X2 240 | 2048 RAM | Win XP SP 3
» Projekt(e): Fusion (eingestellt), SAS (eingestellt), Moviez
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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...
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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$
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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")
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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)  )
1. Win10
PB6.1
Antworten