Huuuff. Um aperto frio percorre sua espinha.
Haaaaah. O hálito gelado do seu chefe passa pelo seu pescoço como um esgoto transbordando. Mas você não pode dizer a eles para pairarem em outro lugar... eles estão observando você como um falcão desde que o sistema de controle de tempo do escritório quebrou.
Agora, eles estão lá... pairando... respirando. Huffff.
Veja como resolver o problema com suas próprias mãos com JavaScript. Haaaaa .
Você tem uma planilha de horas semelhante ao conteúdo desta String
:
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`;
Isso é muito fácil. Começamos criando algumas expressões regulares e uma função auxiliar. Então, vamos apenas… Huuuuffh!
Dividimos a string do quadro de horários em linhas individuais e as para criar uma matriz de objetos
Para cada iteração, nós:
A. Divida a linha em torno do ano usando yearRegex
, registrando a sequência de data
B. Colete todos os intervalos de tempo usando intervalsRegex
C. Reduza os intervalos de tempo, analisando cada um como um objeto JavaScript Date usando o auxiliar parseDate
e a string de data da etapa 2.A
Reduza a matriz de objetos para encontrar o total de horas
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);
Se você descomentar console.log(times);
instrução, você verá um array contendo objetos como:
{ 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
, que pode não ser exclusivo dependendo se dois dias incluíram os mesmos intervalos de tempo.times
. Para otimizar esse código, provavelmente seria melhor usar uma única redução em um objeto vazio contendo totalHours
e times
como campos.
Agora você sabe como extrair tempo de um quadro de horários confuso. Com um pouco de esforço extra, você pode até construir um relógio de ponto completo. Mas então você não gastaria todo esse tempo de qualidade conhecendo seu chefe, não é? Huffff.