Huuuff. Ein kaltes Spannungsgefühl schlängelt sich durch deinen Rücken.
Haaaaah. Der eiskalte Atem Ihres Chefs strömt über Ihren Hals wie ein überlaufender Abwasserkanal. Aber man kann ihnen nicht sagen, dass sie sich woanders aufhalten sollen ... Sie beobachten Sie wie ein Falke, seit das Zeiterfassungssystem im Büro kaputt gegangen ist.
Jetzt sind sie einfach da...schweben...atmend. Huffffff.
Hier erfahren Sie, wie Sie mit JavaScript die Dinge selbst in die Hand nehmen. Haaaaa .
Sie haben eine Arbeitszeittabelle, die wie der Inhalt dieser String
aussieht:
const a = `November 30 2023 13:20-15:00, 15:30-16:40 December 4 2023 15:45-16:15, December 5 2023 08:00-08:30, 18:15-19:30, 21:45-22:15, 22:30-23:00 December 6 2023 19:45-21:45 December 7 2023 14:15-14:45, 15:15-15:45, 16:00-16:30, 16:45-17:15, 18:45-20:15, 20:45-22:45 December 13 2023 03:00-03:50 December 15 2023 09:00-09:30 20:30-21:15 21:45-22:30 23:30-24:00 December 16 2023 23:25-23:55 December 17 2023 19:05-19:50 20:30-21:30 22:15-23:45 December 20 2023 23:30-24:00 December 21 2023 02:20-2:50 03:15-03:30 13:40-14:00 16:00-17:15 17:45-18:45 19:20-20:10 21:30-22:20 23:00 - 24:00 December 22 2023 0:00-0:15`;
Das ist ziemlich einfach. Wir beginnen mit der Erstellung einiger regulärer Ausdrücke und einer Hilfsfunktion. Dann werden wir einfach... Huuuuffh!
Wir teilen die Zeichenfolge der Arbeitszeittabelle in einzelne Zeilen auf und sie, um ein Array von Objekten zu erstellen
Für jede Iteration:
A. Teilen Sie die Zeile mithilfe von yearRegex
um das Jahr auf und zeichnen Sie die Datumszeichenfolge auf
B. Erfassen Sie alle Zeitbereichsintervalle mithilfe von intervalsRegex
.
C. Reduzieren Sie die Zeitbereiche und analysieren Sie sie jeweils als JavaScript-Datumsobjekt mithilfe des Hilfsprogramms parseDate
und der Datumszeichenfolge aus Schritt 2.A
Reduzieren Sie die Anzahl der Objekte, um die Gesamtstundenzahl zu ermitteln
const yearRegex = /(\d{4})/gi; const intervalsRegex = /(\d+\:\d+)\s*-\s*(\d+\:\d+)/gi; const parseDate = (date, time) => Date.parse(`${date} ${time}`); let times = [...a.split("\n")].reduce((arr, entryLine) => { let entryLineSplit = entryLine.split(yearRegex); let o = { date: entryLineSplit[0] + entryLineSplit[1], timeRanges: [...entryLine.matchAll(intervalsRegex)], }; o.hoursForDay = o.timeRanges.reduce((total, [x, start, end]) => { let s = parseDate(o.date, start); let e = parseDate(o.date, end); return total + (e - s) / 1000 / 60 / 60; }, 0); return [...arr, o]; }, []); console.log(times); let totalHours = times.reduce((total, { hoursForDay }) => total + hoursForDay, 0); console.log(totalHours);
Wenn Sie die console.log(times);
-Anweisung sehen Sie ein Array mit Objekten wie:
{ date: 'November 30 2023', timeRanges: [ [ '13:20-15:00', '13:20', '15:00', index: 17, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ], [ '15:30-16:40', '15:30', '16:40', index: 30, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ] ], totalHours: 2.8333333333333335 },
Date.parse
.
String.prototype.split
, die möglicherweise nicht eindeutig sind, je nachdem, ob zwei Tage dieselben Zeitintervalle umfassten.times
. Um diesen Code zu optimieren, wäre es wahrscheinlich besser, eine einzelne Reduzierung für ein leeres Objekt zu verwenden, das totalHours
“ und times
als Felder enthält.
Sie wissen jetzt, wie Sie Zeit aus einer unordentlichen Arbeitszeittabelle extrahieren können. Mit etwas mehr Aufwand könnten Sie sogar eine vollwertige Stechuhr bauen. Aber dann könnten Sie nicht so viel Zeit damit verbringen, Ihren Chef kennenzulernen, oder? Huffff.