Forum: PC-Programmierung Zeiterfassung


von Nilix (Gast)


Lesenswert?

Hallo Zusammen

Für das Programmieren einer Zeiterfassung benötige ich eine Funktion um 
die Zeit einzurasten. z.B. Compiller CPP
Als Ausgangs Zeit gilt die Systemzeit PC.

Auf 5 min, 10 min und 15 min.

12:01 -> 12:05  //auf 5 min
12:01 -> 12:10  //auf 10 min
12:01 -> 12:15  //auf 10 min


12:09 -> 12:10  //auf 5 min
12:09 -> 12:10  //auf 10 min
12:09 -> 12:15  //auf 10 min

Hat mir da mal jemand einen Tip zur Vorgehensweise.

Gruß Nilix

von Der Andere (Gast)


Lesenswert?

Nimm halt die Minuten und runde die auf jeweils 5 Minuten auf oder ab.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Nilix schrieb:
> Hat mir da mal jemand einen Tip zur Vorgehensweise

Zettel, Stift, Kopf benutzen -> Algorithmus entwickeln.

von Udo N. (weinbauer73)


Lesenswert?

Man kommt mit den Grundrechenarten aus, um dein Problem zu lösen.

von Ingo L. (corrtexx)


Lesenswert?

1
if(Minute%5 != 0) Minute_5 = (Minute / 5) * 5 + 5;
2
else Minute_5 = Minute;
3
4
if(Minute%10 != 0)Minute_10 = (Minute / 10) * 10 + 10;
5
else Minute_10 = Minute;
6
7
if(Minute%15 != 0)Minute_15 = (Minute / 15) * 15 + 15;
8
else Minute_15 = Minute;

Stundenüberläufe musst du natürlich auch noch abfangen!

von Nilix (Gast)


Lesenswert?

Super Ingo Danke

von Karl H. (kbuchegg)


Lesenswert?

Tip:
Manchmal rechnen sich Dinge einfacher, wenn man nicht getrennt in 
Minuten und Stunden agiert, sondern zb in diesem Fall einfach eine 
'Minutenzählung ab Mitternacht' macht.
Stunden und Minuten in diese 'Minuten ab Mitternacht' umzurechnen ist 
trivial. Dann wird so gerundet, wie du das haben möchtest und danach der 
erhaltene 'Minutenwert ab Mitternacht' wieder in Stunden und Minuten 
zurück verwandelt.

Sinn der Sache ist es, dass man beim Runden sich nicht grossartig um 
Stundenüberläufe kümmern muss.

von Ingo L. (corrtexx)


Lesenswert?

Karl H. schrieb:
> Sinn der Sache ist es, dass man beim Runden sich nicht grossartig um
> Stundenüberläufe kümmern muss.
Das ist wieder so ein "Karl-Heinz-in-Aktion". Echt guter Tip.

von Route_66 H. (route_66)


Lesenswert?

Ingo L. schrieb:
> Das ist wieder so ein "Karl-Heinz-in-Aktion". Echt guter Tip.

Den Trick hat er sich nicht ausgedacht, das wird schon seit Jahrzehnten 
so gemacht (UNIX-Zeit). So spart man sich Bytes beim Abspeichern von 
Datum und Zeitangaben. (32 Bit reichen bis 2038). Die Umrechnung in 
Jahr, Monat, Tag, Stunde... Schaltjahr usw. ist ja nur für uns Menschen 
erforderlich, dem Computer ist sowas egal.

https://de.wikipedia.org/wiki/Unixzeit

von Ingo L. (corrtexx)


Lesenswert?

Route 6. schrieb:
> So spart man sich Bytes beim Abspeichern von
> Datum und Zeitangaben.
Das ist natürlich auch n Aspekt, zumal Speicher heutzutage mehr als 
knapp ist ;). Spass bei Seite, das UNIX-Zeitformat ist mir bekannt, aber 
es hierauf anzuwenden ist eine brillante Idee.

von Karl H. (kbuchegg)


Lesenswert?

Route 6. schrieb:
> Ingo L. schrieb:
>> Das ist wieder so ein "Karl-Heinz-in-Aktion". Echt guter Tip.
>
> Den Trick hat er sich nicht ausgedacht, das wird schon seit Jahrzehnten
> so gemacht (UNIX-Zeit).


Eigentlich ist die 'Technik' sogar noch viel älter.
Das älteste Beispiel, das mir einfällt, ist das Julianische Datum. 
Einfach eine fortlaufende Tagzählung, die mit dem 1. Jannuar 4713 vor 
Christus beginnt.

Wer jemals astronoimsche Berechnungen gemacht hat, weiss den Segen zu 
schätzen, wenn man einfach eine gewisse Anzahl an Differenztagen zu 
einem 'Datum' addieren kann, ohne sich ständig mit 
Tag/Monat/Jahr/Schaltjahr rumärgern zu müssen.


Das Prinzip lässt sich überall anwenden. Wir sind das nicht mehr so 
gewohnt, weil wir seit der franz. Revolution vereinheitlichte 
Masssysteme auf Basis von 10-er Potenzen haben. So etwas wie "Addieren 
sie zu Meilen und Füssen Yards Furlongs und Inch dazu" ist für uns kein 
Thema mehr. Der einfachste Weg ist auch hier erst mal alles in eine 
einzelne Basiseinheit zurückzurechnen, dort dann die Operation machen 
und von dort dann wieder in die diversen Einzeleinheiten aufzusplitten 
(wenn man die braucht, zb für Anzeigezwecke). Das einzige, bei dem wir 
uns noch ärgern sind: Datum, Uhrzeit, Winkel.

Und natürlich ist das die Basis der allseits geschätzten Fixpunkt 
Arithmetik.

: Bearbeitet durch User
von Robert L. (lrlr)


Lesenswert?

>das wird schon seit Jahrzehnten so gemacht (UNIX-Zeit).
bis man im Jahr 1999 drauf gekommen ist, dass man das doch nicht überall 
so gemacht hat, und das Jahr 00 u.U Probleme macht..



>32 Bit reichen bis 2038

das ist nicht das einzige Problem
auch Zeitzonen, Schaltsekunden und Sommer/Winterzeit lassen sich in 
32Bit nicht so recht unterbringen..

soviel zu "genial"..

von Karl H. (kbuchegg)


Lesenswert?

Robert L. schrieb:

> das ist nicht das einzige Problem
> auch Zeitzonen, Schaltsekunden und Sommer/Winterzeit lassen sich in
> 32Bit nicht so recht unterbringen..
>
> soviel zu "genial"..

Definitionssache.
Wir definieren: die Unix Systemzeit ist immer in UTC.
Die Umrechnung in die aktuelle lokale Zeit erledigt dann eine Funktion, 
die über derartige Besonderheiten bescheid weiss.

Aber ich geb dir recht. Das ist bei den Zeiten tatsächlich 
besch...eiden. Das liegt allerdings weniger an der Unix Zeit, sondern 
mehr daran, dass Zeitsysteme grundsätzlich simpel aussehen, der Teufel 
allerdings im Detail liegt.

von Rabenhorst (Gast)


Lesenswert?

Karl H. schrieb:
> Aber ich geb dir recht. Das ist bei den Zeiten tatsächlich
> besch...eiden. Das liegt allerdings weniger an der Unix Zeit, sondern
> mehr daran, dass Zeitsysteme grundsätzlich simpel aussehen, der Teufel
> allerdings im Detail liegt.

Halb-OT:
Ich weiß nicht, ob hier jemand Jon Skeet kennt (ganz unterhaltsamer 
Redner, Softwareingenieur bei Google, hat ein paar Bücher und u.a. die 
Library "Noda Time" geschrieben). Jedenfalls ist dieses "besch...eiden" 
eines seiner Lieblingsthemen. Wenn man ihm mal eine Weile zugehört hat, 
möchte man bei jeder Begegnung mit Zeit oder Datum umdrehen sehr schnell 
und weit laufen.

von Eric B. (beric)


Lesenswert?

Ingo L. schrieb:
>
1
> if(Minute%5 != 0) Minute_5 = (Minute / 5) * 5 + 5;
2
> else Minute_5 = Minute;
3
>...
4
>

oder noch ein bisschen allgemeiner:
1
int round(int minute, int round_at)
2
{
3
  return ((minute + (round_at / 2)) / round_at) * round_at;
4
}
5
6
int decihour = round(minute, 6) // ;-)

von Georg (Gast)


Lesenswert?

Nilix schrieb:
> Auf 5 min, 10 min und 15 min.

Von allen anderen Zeitproblemen mal abgesehen, eine auf 5 min gerundete 
Zeit würde ich keinesfalls zur Datenspeicherung benutzen, sondern die 
UTC-Zeit abspeichern. Der Grund hat mit IT wenig zu tun: die Tatsache 
dass Arbeitszeiten nur in 5min-Einheiten erfasst werden (was immer das 
soll), ist ohnehin zustimmungspflichtig durch einen Betriebsrat, und 
wenn ein Mitarbeiter dagegen klagt, könnte er leicht recht bekommen. Es 
wäre sehr peinlich und teuer, dann alles von Grund auf ändern zu müssen.

Georg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.