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
Nilix schrieb: > Hat mir da mal jemand einen Tip zur Vorgehensweise Zettel, Stift, Kopf benutzen -> Algorithmus entwickeln.
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!
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.
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.
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
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.
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
>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"..
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.
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.
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) // ;-) |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.