Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Stefan Reuther Newsgroups: de.comp.lang.javascript Subject: Re: Arbeitszeiten in JavaScript Date: Sun, 17 Mar 2024 09:42:32 +0100 Lines: 71 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net +oRlr579TIKC9LVGjd6ODASQ2DppdI72wOGhCo3a01mSgQ+mnc Cancel-Lock: sha1:SxywAz+iKpKjgiiZ3v38QG9HBIs= sha256:cNgctCXa8lN2cyl8GIVTyv+2Wa36hxQkl5adA+Uobf8= User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.12.1 Hamster/2.1.0.1538 In-Reply-To: Xref: csiph.com de.comp.lang.javascript:5464 Am 16.03.2024 um 22:03 schrieb Maik Koenig: > Momentan behelfe ich mir ziemlich umständlich: Ich stelle erstmal fest, > in welcher Schicht ich mich befinde indem ich die "Jetzt-Zeit" mit den > jeweiligen Start- und Endzeiten der drei Schichten vergleiche. Dann > gucke ich ob ich gerade mitten in einer Pause bin. Dann berechne ich die > restliche Arbeitszeit bis zur nächsten Unterbrechung. Nach einem kurzen > Check ob die Zeit reichen würde um den Job abzuschliessen ziehe ich die > Zeit von der Gesamtarbeitszeit ab und überspringe die Pausenzeit. Dann > wieder gucken ob die Gesamtarbeitszeit bis zur nächsten Unterbrechung > ausreicht um den Job abzuschliessen und so weiter, bis ich dann > irgendwann einen vermutlichen Termin für den Abschluss der Arbeiten habe. > > Es funktioniert, aber das sind verdammt viele Zeilen Code um am Ende > "nur" einen Zeitpunkt zu bekommen. Zumal das Rechnen mit Stunden und > Minuten in JavaScript eher suboptimal ist, ich habe Date() inzwischen > wirklich hassen gelernt. Um die Logik wie beschrieben wirst du nicht herumkommen, aber eventuell kann man es kleverer aufschreiben. Zuerst würde ich über die Datums-Repräsentation nachdenken. Brauchst du wirklich ein Datum in der realen Welt oder reicht ein einfacher Wert wie z.B. "Zeit seit " (Mitternacht, Montag Mitternacht, 1.1.1970), ausgedrückt in Sekunden oder Minuten? Wenn du mit Zahlen statt Date()-Objekten rechnen kannst, wird es einfacher. Angenommen, die Zeit wird repräsentiert als "Minuten seit Mitternacht an ", dann wird eine Funktion zur Klassifizierung sowas wie var TIMES = [6*60, 6*60+30, // Pause von 6:00 bis 6:30 12*60, 13*60, // Pause von 12:00 bis 13:00 18*60, 18*60+30]; // Pause von 18:00 bis 18:30 function classify(t) { var mins = t % 24*60; // Minuten seit Mitternacht for (var i = 0; i < TIMES.length; ++i) { if (mins < TIMES[i]) { return { isPause: i%2, duration: TIMES[i] - t }; } } return { isPause: 0, duration: 24*60-t }; // Arbeit bis Mitternacht } und die Berechnung sowas wie function completionTime(t, work) { while (work > 0) { var k = classify(t); if (!k.isPause) { // wenn keine Pause, verrichte Arbeit var now = Math.min(work, k.duration); work -= now; t += now; } else { t += k.duration; // Pause, einfach nur Zeit weitersetzen } } return t; } (Disclaimer: ungetestet runtergeschrieben) Das halte ich jetzt für recht übersichtlich. In Date() umrechnen muss man dann nur für die Ein-/Ausgabe. Sommerzeit und Feiertage wären in der classify()-Funktion zu berücksichtigen, das sollte aber relativ einfach handhabbar sein. Falls du auf irgendwelche Magie in Date() gehofft hast, die mit Schaltsekunden umgeht: gibt's nicht. Aber damit kann man dann eben auch z.B. den Wochentag bekommen mit '(t / (24*60)) % 7'. Stefan