Groups | Search | Server Info | Login | Register


Groups > de.comp.lang.javascript > #5464

Re: Arbeitszeiten in JavaScript

Path csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From Stefan Reuther <stefan.news@arcor.de>
Newsgroups de.comp.lang.javascript
Subject Re: Arbeitszeiten in JavaScript
Date Sun, 17 Mar 2024 09:42:32 +0100
Lines 71
Message-ID <ut6du8.5a4.1@stefan.msgid.phost.de> (permalink)
References <ut54un.io.1@mid.maikkoenig.de>
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 <ut54un.io.1@mid.maikkoenig.de>
Xref csiph.com de.comp.lang.javascript:5464

Show key headers only | View raw


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 <Zeitpunkt>" (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
<Tag>", 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

Back to de.comp.lang.javascript | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Arbeitszeiten in JavaScript Maik Koenig <usenetspam@maikkoenig.de> - 2024-03-16 22:03 +0100
  Re: Arbeitszeiten in JavaScript "Peter J. Holzer" <hjp-usenet4@hjp.at> - 2024-03-16 23:21 +0100
    Re: Arbeitszeiten in JavaScript Maik Koenig <usenetspam@maikkoenig.de> - 2024-03-17 08:12 +0100
  Re: Arbeitszeiten in JavaScript Janis Papanagnou <janis_papanagnou+ng@hotmail.com> - 2024-03-17 09:36 +0100
    Re: Arbeitszeiten in JavaScript Maik Koenig <usenetspam@maikkoenig.de> - 2024-03-17 18:12 +0100
      [OT] Eigenentwicklung vs. Produkt (war Re: Arbeitszeiten in JavaScript) Janis Papanagnou <janis_papanagnou+ng@hotmail.com> - 2024-03-18 06:36 +0100
        Re: [OT] Eigenentwicklung vs. Produkt (war Re: Arbeitszeiten in JavaScript) Maik Koenig <usenetspam@maikkoenig.de> - 2024-03-18 07:56 +0100
          Re: [OT] Eigenentwicklung vs. Produkt (war Re: Arbeitszeiten in JavaScript) Janis Papanagnou <janis_papanagnou+ng@hotmail.com> - 2024-03-19 06:47 +0100
        Re: [OT] Eigenentwicklung vs. Produkt (war Re: Arbeitszeiten in JavaScript) "Peter J. Holzer" <hjp-usenet4@hjp.at> - 2024-03-18 20:37 +0100
  Re: Arbeitszeiten in JavaScript Stefan Reuther <stefan.news@arcor.de> - 2024-03-17 09:42 +0100
    Re: Arbeitszeiten in JavaScript Maik Koenig <usenetspam@maikkoenig.de> - 2024-03-17 15:10 +0100
      Re: Arbeitszeiten in JavaScript "Peter J. Holzer" <hjp-usenet4@hjp.at> - 2024-03-17 16:42 +0100
        Re: Arbeitszeiten in JavaScript Maik Koenig <usenetspam@maikkoenig.de> - 2024-03-17 18:33 +0100
          Re: Arbeitszeiten in JavaScript Tim Landscheidt <tim@tim-landscheidt.de> - 2024-03-18 08:36 +0000
          Re: Arbeitszeiten in JavaScript Stefan Reuther <stefan.news@arcor.de> - 2024-03-18 17:58 +0100

csiph-web